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\n",dp[sn-1][0]); 42 } 43 return 0; 44 }