首页 > 代码库 > poj3311 Hie with the Pie,状态压缩
poj3311 Hie with the Pie,状态压缩
题目链接:http://poj.org/problem?id=3311
Floyd + 状态压缩DP
题意是有N个城市(1~N)和一个PIZZA店(0),要求一条回路,从0出发,又回到0,而且距离最小。
状态:dp[S][v]表示从v出发访问剩余的所有顶点(集合S),最终回到顶点0的路径的权重总和最小值。
#include <cstdio> #include <cstring> #include <algorithm> using namespace std; const int maxn = 12; const int INF = 0x3f3f3f3f; int d[maxn][maxn]; int dp[1<<maxn][maxn]; int main() { int n; while(~scanf("%d", &n)){ if(n==0) break; n++; for(int i=0; i<n; ++i){ for(int j=0; j<n; ++j) scanf("%d", &d[i][j]); } for(int k=0; k<n; ++k) for(int i=0; i<n; ++i) for(int j=0; j<n; ++j) { d[i][j] = min(d[i][j], d[i][k] + d[k][j]); } int S = 1<<n; for(int i=0; i<S; ++i){ fill(dp[i], dp[i]+n, INF); } dp[S-1][0] = 0; for(int i=S-2; i>=0; --i){ for(int v=0; v<n; ++v){ for(int u=0; u<n; ++u){ if(!(i>>u&1) ){ dp[i][v] = min(dp[i][v], dp[i|1<<u][u]+d[v][u]); } } } } printf("%d\n", dp[0][0]); } return 0; }
poj3311 Hie with the Pie,状态压缩
声明:以上内容来自用户投稿及互联网公开渠道收集整理发布,本网站不拥有所有权,未作人工编辑处理,也不承担相关法律责任,若内容有误或涉及侵权可进行投诉: 投诉/举报 工作人员会在5个工作日内联系你,一经查实,本站将立刻删除涉嫌侵权内容。