POJ 3311 Hie with the Pie 先用floyd预处理,再状态压缩

下面是别人的解题报告链接:

http://blog.csdn.net/accry/article/details/6607703

下面是我的代码,我觉得链接中的代码有一点小问题,也许是我想错了吧。

 1 #include <cstdio>
 2 #define min(a,b) (a) < (b) ? (a) : (b);
 3 #define INF 100000000
 4 int dist[13][13];
 5 int dp[2050][13];
 6 void init(int n)
 7 {
 8     for(int i=0; i<=n; ++i)
 9         for(int j=0; j<=n; ++j)
10             scanf("%d",&dist[i][j]);
11     for(int k =0; k <=n; ++k)
12         for(int i=0; i<=n; ++i)
13             for(int j=0; j<=n; ++j)
14                 dist[i][j] = min(dist[i][j],dist[i][k]+dist[k][j]);
15 }
16 int main()
17 {
18 //    freopen("in.cpp","r",stdin);
19     int n;
20     while(scanf("%d",&n), n)
21     {
22         init(n);
23         int sn = 1<<(n+1);//状态数
24         for(int i=0; i<sn; ++i)
25             for(int j=0; j<=n; ++j)
26                 dp[i][j] = INF;
27         for(int i=0; i<=n; ++i)
28             dp[(1<<i)][i] = dist[0][i];
29         for(int k=1; k<sn; ++k)
30         {
31             for(int i=0; i<=n; ++i)
32             {
33                 if(! (k & (1<<i) )) continue;
34                 for(int j=0; j<=n; ++j)
35                 {
36                     if( j != i &&  k & (1 << j) )
37                         dp[k][i] = min(dp[k][i] , dp[k^(1<<i)][j]+dist[j][i] );
38                 }
39             }
40         }
41         printf("%d
",dp[sn-1][0]);
42     }
43     return 0;
44 }
View Code
原文地址:https://www.cnblogs.com/allh123/p/3232613.html