标签:就是 zcat blank turn 题解 百度搜索 练习 mem col
昨天想练习一下状态压缩,百度搜索看到有博客讨论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) 旅行商问题
标签:就是 zcat blank turn 题解 百度搜索 练习 mem col
原文地址:https://www.cnblogs.com/izcat/p/10618740.html