TSP问题

题目解析、自码代码待编辑

核心代码

//输入
int n;
int d[MAX_N][MAX_N];

int dp[1 << MAX_N][MAX_N];   //记忆化搜索使用的 DP数组

//已经访问过的顶点集合为 S,当前位置为 v
int rec(int S, int v) {
    if (dp[S][v] >= 0)    return dp[S][v];
    
    if (S == (1 << n) - 1 && v == 0){
        //已访问过所有顶点并回到 0号起点
        return dp[S][v] = 0; 
    }
    
    int res = INF;  //无穷大值
    for (int u = 0; u < n; u++){
        if (!(S >> u & 1)) {
            res = min(res,rec(S | 1 << u, u) + d[v][u]);
        }
    }
    return dp[S][v] = res; 
} 

void solve() {
    memset(dp, -1, sizeof(dp));
    cout << rec(0,0);
}

猜你喜欢

转载自www.cnblogs.com/Sansetto/p/11240453.html
TSP
今日推荐