题目↓(建议全屏看图)
常规状压,集合思想;挺简单的 具体看代码吧
#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; }