题目给了你一个n个点的带权无向图,编号为0~n-1,求0到n-1的最短Hamilton路(即0~n-1经过每个点有且仅有一次)
由于n较小,但使用暴力还是明显要超时。所以可以想到用状压dp来做。f[i][j]表示当前经过点的状态为i(0表示未经过,1表示已经过),当前处于j点时的最短路径。
#include<cstdio>
#include<cstring>
#include<cmath>
#include<algorithm>
using namespace std;
int n,a[35][35];
long long f[1050035][25];
int main()
{
scanf("%d",&n);
for (int i=0;i<n;i++)
for (int j=0;j<n;j++)
scanf("%d",&a[i][j]);
memset(f,0x3f,sizeof(f));
f[1][0]=0;
for (int i=1;i<1<<n;i++)
{
for (int j=0;j<n;j++)
{
if (i >> j & 1)
for (int k=0;k<n;k++)
if ((i^1<<j)>>k&1) f[i][j]=min(f[i][j],f[i^1<<j][k]+a[k][j]);
}
}
printf("%lld\n",f[(1<<n)-1][n-1]);
}