hdu3001 Travelling 三进制状态压缩dp
2016-02-26 15:44
411 查看
tsp类型,只是这里面的点最多可以访问2次。
所以用一个来表示访问了多少次,正好是三进制。
对于每个状态i,先处理出第j位为几,即num[i][j],方便使用。
用dp[i][j]表示,状态i时,以j为终点的最小花费。然后是和tsp一样扩展下一个点。
所以用一个来表示访问了多少次,正好是三进制。
对于每个状态i,先处理出第j位为几,即num[i][j],方便使用。
用dp[i][j]表示,状态i时,以j为终点的最小花费。然后是和tsp一样扩展下一个点。
#include<bits/stdc++.h> using namespace std; const int inf=0x7fffffff; int d[12],num[60000][12],dp[60000][12]; int main() { int i,n,m,g[20][20],a,b,w,ans,flag,j,k,news; d[0]=1; for(i=1;i<=11;i++) d[i]=d[i-1]*3; while(scanf("%d%d",&n,&m)!=EOF) { for(i=0;i<=n;i++) for(j=0;j<=n;j++) g[i][j]=inf; for(i=0;i<m;i++) { scanf("%d%d%d",&a,&b,&w); a--; b--; g[a][b]=g[b][a]=min(w,g[a][b]); } for(i=0;i<d[10];i++) { a=i; for(j=0;j<10;j++) { num[i][j]=a%3; a/=3; } } for(i=0;i<d ;i++) { for(j=0;j<10;j++) { dp[i][j]=inf; } } for(i=0;i<n;i++) dp[d[i]][i]=0; ans=inf; for(i=0;i<d ;i++) { flag=1; for(j=0;j<n;j++) { if(num[i][j]==0) flag=0; if(dp[i][j]==inf) continue; for(k=0;k<n;k++) { if(g[j][k]==inf||num[i][k]==2) continue; news=i+d[k]; dp[news][k]=min(dp[news][k],dp[i][j]+g[j][k]); } } if(flag) { for(j=0;j<n;j++) ans=min(ans,dp[i][j]); } } if(ans==inf) ans=-1; printf("%d\n",ans); } return 0; }
相关文章推荐
- 关于springmvc重定向如何携带参数的问题
- JAVA读取文本.XML等文件
- 【poj1064】cable master——二分
- Limit
- PostgreSQL 安装,使用总结
- AC算法详解
- 【CSS3】关于box-shadow的扩展半径
- OpenSSL
- 213. House Robber II【M】【60】【leetcode】
- SAP的号码范围(number range)SNRO和SNUM自动编号工具的用法
- servlet向jsp传递参数
- APK魔鬼瘦身计划
- Android 属性动画(Property Animation) 完全解析 (上)
- MySQL:MySQL日期数据类型、MySQL时间类型
- Cocoapods系列教程(二)——开源主义接班人
- 微信分享到好友或者朋友圈的截屏图片
- TextField委托方法记录(限制特定字符和限制字数)
- myeclipse更新完项目之后,JS以及JSP文件会报错
- MyEclipse10 中安装Activiti插件后,新建Activiti项目无Maven功能
- leetcode笔记:Contains Duplicate III