题目↓(建议全屏看图)

常规状压,集合思想;挺简单的 具体看代码吧
#include<bits/stdc++.h>
using namespace std;
#define fr(g,h) for(int g = 0; g < h; g++)
const int N = 25, M = 2100000;
int n,nn,mm,a[N][N],f[N][M];
inline void init ()
{
scanf("%d",&n);
fr(i,n)
fr(j,n)
cin >> a[i][j];
memset(f, 0x3f, sizeof f);
}
void floyd()
{
fr(k,n)
fr(i,n)
fr(j,n)
a[i][j] = min(a[i][j], a[i][k] + a[k][j]);
}
void dp()
{
for(int s = 1; s <= (1 << n) - 1; s++) //从第一个开始走过 (这个地方s的优化还是蛮重要的,暴力开210万只能险过)
fr(i,n)
fr(j,n)
if(s & (1 << j))
f[i][s|(1<<i)] = min(f[i][s|(1<<i)], f[j][s] + a[i][j]);
}
int main()
{
init();
f[0][1] = 0;
floyd();
dp();
cout << f[0][(1<<n) - 1];
return 0;
}