最短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 } 

 

posted @ 2018-12-22 10:59  宇興  阅读(117)  评论(0编辑  收藏  举报