最短Hamilton路径
1 #include<bits/stdc++.h> 2 using namespace std; 3 int f[1<<21][21],w[21][21],n; 4 int main() 5 { 6 scanf("%d",&n); 7 for(int i=0;i<n;i++) 8 for(int j=0;j<n;j++) 9 scanf("%d", &w[i][j]); 10 memset(f,0x3f,sizeof(f)); 11 f[1][0]=0; 12 for(int i=1;i<(1<<n);i++) 13 for(int j=0;j<n;j++) 14 if((i>>j)&1) 15 for(int k=0;k<n;k++) 16 if((i&(~(1<<j)))>>k&1) 17 f[i][j]=min(f[i][j],f[i&(~(1<<j))][k]+w[k][j]); 18 printf("%d",f[(1<<n)-1][n-1]); 19 return 0; 20 }