如何跟踪TSP中的路径?

时间:2015-06-12 07:50:53

标签: algorithm computer-science dynamic-programming traveling-salesman

我找到了一个使用位掩码here的TSP问题的简单解决方案。

int n, src;
vector< vector< int > > graph, dp;
// initial status
void init() {
    for ( int i = 0; i < n; ++i ) 
        dp[ 1 << i ][ i ] = graph[ src ][ i ];
}
// TSP recursive
int TSP( int status, int x ) {

    if ( dp[ status ][ x ] != -1 )
        return dp[ status ][ x ];

    int mask = 1 << x;
    dp[ status ][ x ] = 1e9;
    for ( int i = 0; i < n; ++i )
        if ( i != x && ( status & ( 1 << i ) ) )
            dp[ status ][ x ] = min( dp[ status ][ x ], TSP( status - mask, i ) + graph[ i ][ x ] );
    return dp[ status ][ x ];
}

int main() {
    scanf( "%d %d", &n, &src );
    graph = vector< vector< int > >( n, vector< int >( n ) );
    dp = vector< vector< int > >( 1 << n, vector< int >( n, -1 ) );
    for ( int i = 0; i < n; ++i )
        for ( int j = 0; j < n; ++j ) {
            int x;
            scanf( "%d", &x );
            graph[ i ][ j ] = x;
        }

    init();
    printf( "%d\n", TSP( ( 1 << n ) - 1, src ) );
    return 0;
}

如果我想知道解决方案的路径怎么办?我该如何实现? 我想到的是添加变量track[status][list of path]。但是,我认为这不是一个好的解决方案。跟踪路径的最佳方法是什么?

0 个答案:

没有答案