Hie with the Pie (POJ 3311) 旅行商问题
Posted izcat
tags:
篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了Hie with the Pie (POJ 3311) 旅行商问题相关的知识,希望对你有一定的参考价值。
昨天想练习一下状态压缩,百度搜索看到有博客讨论POJ 3311,一看就是简单的旅行商问题,于是快速上手写了状态压缩,死活样例都没过。。。
画图模拟一遍原来多个城市可以重复走,然后就放弃思考了。。。
刚刚把这个无聊的问题解决了,简单的Floyd+状压。
所谓Floyd算法,我在暑训的博客里提过,复杂度O(n3),但当时数据量太大不适合使用,这里刚好派上了用场。
#include<cstdio> #include<iostream> #include<cstring> #include<algorithm> using namespace std; const int INF = 0x3f3f3f3f; int dis[12][12], n; int dp[1<<12][12]; // dp[S][u] 从u出发从S的剩下城市走到0的最短时间 int dfs(int S, int u) { if(dp[S][u]>0) return dp[S][u]; if(S==(1<<(n+1))-1 && u==0) return dp[S][u] = 0; int res = INF; for(int v=0;v<=n;v++) { if(v!=u && !((S>>v)&1)) res = min(res, dfs(S|(1<<v), v)+dis[u][v]); } return dp[S][u] = res; } int main() { while(cin>>n) { if(n==0) break; for(int i=0;i<=n;i++) for(int j=0;j<=n;j++) cin>>dis[i][j]; // Floyd算法 for (int k=0;k<=n;k++) for (int i=0;i<=n;i++) for (int j=0;j<=n;j++) dis[i][j] = min(dis[i][j], dis[i][k]+dis[k][j]);
memset(dp, -1, sizeof(dp)); cout<<dfs(0, 0)<<endl; } return 0; }
交一发直接AC了感觉索然无味啊。。。还是要多找点难题刷刷 0.0
以上是关于Hie with the Pie (POJ 3311) 旅行商问题的主要内容,如果未能解决你的问题,请参考以下文章
Hie with the Pie(POJ 3311)状压DP