最短Hamilton路径

最短Hamilton路径

利用动态规划可以很好地解决这个问题。

\(dp[i][j]\)中 i 利用状态压缩,可以表示已经走过了多少个点,j 表示的是当前所在点。

// Created by CAD on 2020/2/26.
#include <bits/stdc++.h>
#define mst(name, value) memset(name,value,sizeof(name))
using namespace std;

int dp[1<<20][25];
int g[25][25];
int main()
{
    ios::sync_with_stdio(false);
    cin.tie(0);
    int n;cin>>n;
    for(int i=0;i<n;++i)
        for(int j=0;j<n;++j) cin>>g[i][j];
    mst(dp,0x7f);
    dp[1][0]=0;
    for(int k=0; k<(1 << n); ++k){
        for(int i=0;i<n;++i)
            if(k>>i&1) continue;
            else
                for(int j=0;j<n;++j)
                    if(k>>j&1)
                        dp[k|1<<i][i]=min(dp[k|1<<i][i],dp[k][j]+g[j][i]);
    }
    cout<<dp[(1<<n)-1][n-1]<<"\n";
    return 0;
}
posted @ 2020-02-26 14:10  caoanda  阅读(142)  评论(0编辑  收藏  举报