hdu 3001 Travelling 旅行商问题
来源:互联网 发布:黑白激光打印机 知乎 编辑:程序博客网 时间:2024/05/29 16:18
题意:
ACMer 想要游玩n个城市,告诉我们每个城市间的旅行费用,并且要求每个城市最多走两遍!问最小花费是多少 ?!
思路:
典型的TSP问题,唯一的变化就是走两遍!
解法:
利用三进制将边点j 在点集i 出现的次数表示成 tir[i][j];
状态转移方程:l=i+s[k];边界
dp[l][k]=min(dp[i][j]+map[j][k]);
#include<iostream>#include<cstdio>#include<algorithm>#include<memory.h>using namespace std;const int INF=0x3f3f3f3f;int s[12],dp[60000][12],n,m,tir[60000][12],map[12][12];void init(){ s[0]=1; for(int i=1; i<=10; i++) s[i]=s[i-1]*3; for(int i=0; i<=s[10]; i++) { int t=i; for(int j=0; j<10; j++) { tir[i][j]=t%3; t/=3; } }}void DP(){ int i,j,k,ans=INF; for(i=0; i<s[n]; i++) { int flag=1;//所有位都被遍历过 for(j=0; j<n; j++) { if(0==tir[i][j]) flag=0;//点j在i集合内 if(dp[i][j]==INF) continue; for(k=0; k<n; k++) { if(j==k||tir[i][k]==2)continue; if(map[k][j]==INF)continue; int l=i+s[k]; dp[l][k]=min(dp[l][k],dp[i][j]+map[j][k]); } } if(flag) for(int t=0; t<n; t++) { ans=min(ans,dp[i][t]); } } if(ans==INF)cout<<-1<<endl; else cout<<ans<<endl;}int main(){ init(); while(scanf("%d%d",&n,&m)!=EOF) { int i,j,k,a,b,c; memset(dp,INF,sizeof(dp)); memset(map,INF,sizeof(map)); for(i=0; i<n; i++)dp[s[i]][i]=0; while(m--) { scanf("%d%d%d",&a,&b,&c); a--,b--; map[a][b]=map[b][a]=min(map[a][b],c); } DP(); } return 0;}
- hdu 3001 Travelling 旅行商问题
- hdu 3001 Travelling (旅行商问题)
- hdu 3001 Travelling 旅行商问题变形 三进制的压缩dp
- hdoj 3001 Travelling 【3进制+旅行商】
- Travelling (三进制加旅行商)
- hdu 3001 Travelling (TSP问题 )
- 旅行商问题(travelling salesman problem, TSP) 解题报告
- hdu 3001 Travelling (TSP问题,状压dp)
- HDU 3001 - Travelling TSP
- hdu 3001 Travelling
- HDU 3001 Travelling
- HDU 3001 Travelling
- Travelling (HDU 3001)
- hdu 3001 Travelling
- hdu 3001 Travelling
- HDU 3001 Travelling
- HDU 3001 Travelling
- hdu 3001 Travelling
- 做个有气质的流氓,做个有品位的色狼,做个有知识的文盲!
- DFS中的奇偶剪枝
- 配置php运行环境
- 最全小布老师所有视频推荐--oracle视频资料库
- 问题:启动增量连接失败
- hdu 3001 Travelling 旅行商问题
- Shell 脚本调试技巧详解
- [iOS开发高效第三方库之]sqlite3封装库---FMDB
- 让PHP以ROOT权限执行系统命令的方法&SUID,SGID,SBIT权限的作用和设置
- Hadoop和Lexst的存储策略
- 卡特兰数
- opencv立体校正函数cvStereoRectify()纠错
- string.IsNullOrEmpty()是什么意思啊
- php调用一个c程序,c程序再调用另一个c程序在后台不间断运行