思路:
状压走过哪些点,然后枚举当前点和上一个点,进行转移
c o d e code code
#include<iostream>
#include<cstdio>
#include<cstring>
using namespace std;
int n;
int a[25][25];
int f[25][1001000];
int main()
{
scanf("%d", &n);
for(int i=1; i<=n; i++)
for(int j=1; j<=n; j++)
scanf("%d", &a[i][j]);
memset(f, 0x3f3f3f3f, sizeof(f));
f[1][1]=0;
for(int i=1; i<(1<<n); i++)
{
for(int j=1; j<=n; j++)
{
if(i&(1<<j-1))
{
int s=i-(1<<j-1);
for(int k=1; k<=n; k++)
{
if(s&(1<<k-1)&&k!=j)
f[j][i]=min(f[j][i], f[k][s]+a[k][j]);
}
}
}
}
printf("%d", f[n][(1<<n)-1]);
return 0;
}