731. 毕业旅行问题 - AcWing题库
所需知识:二进制状态压缩,dp
思路:Hamilton最小路径的变种,如果Hamilton最小路径不懂可以看看我这篇文章AcWing—最短Hamilton路径-CSDN博客
搞懂了Hamilton之后这题就很简单了,遍历一遍以[1,n]为结尾的所有节点加上a[i] [0],取最小值,遍历一遍后的ans即为答案;
C++代码:
#include <iostream>
#include <cstring>
using namespace std;
const int N = 20,M=1<<N;
int a[N+10][N+10];
int n;
int f[M][N+10];
int main()
{
cin>>n;
for (int i = 0; i < n; i ++ ){
for (int j = 0; j < n; j ++ ){
cin>>a[i][j];
}
}
memset(f,0x3f,sizeof f);
f[1][0]=0;
for (int i = 0; i <(1<<n); i ++ ){
for (int j = 0; j < n; j ++ ){
if((i>>j)&1)//判断某一个数的第j为是不是1
for (int k = 0; k < n; k ++ ){
if((i>>k)&1)
f[i][j]=min(f[i][j],f[i-(1<<j)][k]+a[k][j]);
}
}
}
int ans=0x3f3f;
for (int i = 0; i <= n; i ++ ){
ans=min(ans,f[(1<<n)-1][i]+a[i][0]);
}
cout<<ans;
return 0;
}