HDOJ 5418 Victor and World
来源:互联网 发布:网络利大于弊的辩论词 编辑:程序博客网 时间:2024/05/19 06:48
题目链接:http://acm.hdu.edu.cn/showproblem.php?pid=5418
题意:给我们一些无向边,问我们经过所有的点再回到起点的最短的路径长度是多少。
如果题目说每个城市只能走一次,那么问题就变成了求一条最短的哈密尔顿回路,而求解哈密尔顿回路是一个NP问题……抱着这个思路多看了一眼,题目并没有说明一个城市只能走一次,那么也就是说从一个城市到另一个城市的话我们就可以没有限制的直接走最短路径。而作为一个状态压缩的题目n<16,我们可以很轻易的用到Floyd算法求得两两之间的最短路径。
我们用dp[i][cur]表示的是在cur(二进制表示当前走过哪些城市)的情况下,最后呆在第i个城市走的最短路径,我们枚举下一个城市k会是哪一个,那么dp[i][cur] = min(dp[i][cur], dp[k][cur^(1<<(k-1))] + G[i][k])。
#include<iostream>#include<cstdio>#include<cstring>using namespace std;const int maxn = 17;const int INF = 0x3f3f3f3f;int G[maxn][maxn],dp[maxn][1<<maxn|1],n;void Floyd(){for(int k=1; k<=n; k++)for(int i=1; i<=n; i++)for(int j=1; j<=n; j++)G[i][j] = min(G[i][j], G[i][k]+G[k][j]);}int main(){ int T,x,y,z,m; cin>>T; while(T--) { scanf("%d%d",&n,&m); memset(G,INF,sizeof(G)); for(int i=0; i<m; i++){int u,v,w;scanf("%d%d%d", &u,&v,&w);G[u][v] = min(G[u][v], w);G[v][u] = min(G[v][u], w);}if(n == 1){printf("0\n");continue;} Floyd(); memset(dp,INF,sizeof(dp)); dp[1][1]=0; for(int cur=1; cur<(1<<n); cur++)for(int i=1; i<=n; i++)if((cur&(1<<(i-1))))for(int k=1; k<=n; k++)if(cur&(1<<(k-1)) && i!=k)dp[i][cur] = min(dp[i][cur], dp[k][cur^(1<<(i-1))]+G[k][i]); int ans=INF; for(int i=2; i<=n; i++) ans=min(ans,dp[i][(1<<n)-1]+G[i][1]); printf("%d\n",ans); } return 0;}
0 0
- HDOJ 5418 Victor and World
- 【HDOJ 5418】 Victor and World (状压dp)
- HDOJ 5418 Victor and World 状压DP
- hdu 5418 Victor and World
- hdu 5418 Victor and World
- HUD 5418 Victor and World
- hdu 5418 Victor and World 状压DP
- hdu 5418 Victor and World【状态压缩】
- hdu 5418 Victor and World(dp)
- HDU-5418 Victor and World(状压+spfa)
- BestCoder#52 Victor and World
- HDOJ 5417 Victor and Machine
- hdu 5418 Victor and World (floyd+状压dp)
- hdu 5418 Victor and World(floyd+状压dp)
- hdu 5418 Victor and World 最短路 floyd 解题报告
- hdu--5418Victor and World+状态压缩DP
- hdu 5418 Victor and World(旅行商问题)
- HDU 5418 Victor and World(状压dp、最短路)
- 用parse_url() 解析URL中的详细信息
- mapreduce job所需要的各种参数在Sqoop中的实现
- 面向切面的AOP编程
- Android-Studio常见报错解决方案
- C++ 面向对象
- HDOJ 5418 Victor and World
- Android 难题解决
- DNS预获取(dns-prefetch)
- 键盘挡住textfield的简单处理方法
- APUE 《UNIX环境高级编程》编译问题彻底解决方案
- Android MVP与MVC框架模式
- java剧院管理系统,数据存储mysql
- uboot 命令使用教程(uboot参数设置)
- Qt5 中文显示