最短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;
}
CAD加油!欢迎跟我一起讨论学习算法,QQ:1401650042