AcWing 731. 毕业旅行问题
原题链接
困难
作者:
fairydetail
,
2019-04-24 20:16:42
,
所有人可见
,
阅读 1674
#include<iostream>
#include<algorithm>
#include<cstring>
using namespace std;
const int N=20,M=1<<N;
int n;
int f[M][N];
int w[N][N];
int main()
{
cin>>n;
for(int i=0;i<n;i++)
{
for(int j=0;j<n;j++)
{
cin>>w[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++)//j表示当前城市
{
if(i>>j&1)//若i中第j位为1
{
for(int k=0;k<n;k++)
{
if((i-(1<<j))>>k&1)//若i中第k位为1(且j!=k)
f[i][j]=min(f[i][j],f[i-(1<<j)][k]+w[k][j]);
}
}
}
}
//下面计算回到起点
int res=1e9;
for(int i=0;i<n;i++)
res=min(res,f[(1<<n)-1][i]+w[i][0]);
cout<<res<<endl;
return 0;
}