AcWing 91. 最短Hamilton路径
原题链接
中等
作者:
术
,
2021-03-06 19:00:34
,
所有人可见
,
阅读 231
#include <iostream>
#include <string.h>
using namespace std;
int n;
const int N=21,M=1<<N;
int a[N][N];
int f[M][N];
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;//只经过0点
for(int i=0; i<1<<n; i++) //经过的点为i状态
{
for(int j=0; j<n; j++)
{
if(i>>j&1)//若i有j点
{
for(int k=0; k<n; k++)
if((i-(1<<j))>>k&1)//i中删除j点后有k点
f[i][j]=min(f[i][j],f[i-(1<<j)][k]+a[k][j]);
}
}
}
cout<<f[(1<<n)-1][n-1];//所有点都经过
return 0;
}