poj3229 哈密顿回路
来源:互联网 发布:linux难学吗 编辑:程序博客网 时间:2024/06/02 08:14
很简单的题目,先将路径floyed处理,然后状态压缩DP即可。
ACcode:
#include<cstdio>#include<cstring>const int NS=15;const int MS=1<<NS;const double INF=1e12;int n,m,x,y,f;int ms,lim,res;int dt[2]={80,120};double tmp,k,z;double time[NS];double g[NS][NS];double dp[MS][NS];double Min(double a1,double b1){ return a1<b1?a1:b1;}double Max(double a1,double b1){ return a1>b1?a1:b1;}int getone(int st){ int cnt=0; for (int i=st;i;i=i&(i-1)) cnt++; return cnt;}int main(){ while (~scanf("%d%d%lf",&n,&m,&k)&&(n+m+k)) { ms=0,k*=12,res=-1,lim=1<<n; for (int i=0;i<m;i++) scanf("%d",&x),x--,ms|=1<<x; for (int i=0;i<n;i++) scanf("%lf",&time[i]); for (int i=0;i<n;i++) for (int j=0;j<n;j++) g[i][j]=i==j?0.0:INF; while (~scanf("%d%d%lf%d",&x,&y,&z,&f)&&(x+y+z+f)) { x--,y--,z/=dt[f]; g[y][x]=g[x][y]=Min(g[x][y],z); } for (int c=0;c<n;c++) for (int a=0;a<n;a++) for (int b=0;b<n;b++) g[a][b]=Min(g[a][b],g[a][c]+g[c][b]); for (int i=0;i<lim;i++) for (int j=0;j<n;j++) dp[i][j]=INF; for (int i=0;i<n;i++) dp[1<<i][i]=g[0][i]+time[i]; for (int i=1;i<lim;i++) { for (int j=0;j<n;j++) { if (i&(1<<j)) { y=i^(1<<j); for (int u=0;u<n;u++) if (y&(1<<u)) dp[i][j]=Min(dp[i][j],dp[y][u]+g[u][j]+time[j]); }// printf("dp[%d][%d]=%.2lf\n",i,j,dp[i][j]); } if (((i&ms)==ms)&&(dp[i][0]<k*1.0)&&getone(i)>res) res=getone(i); } if (res<0) printf("No Solution\n"); else printf("%d\n",res); } return 0;}
- poj3229 哈密顿回路
- 最小哈密顿回路
- 哈密顿回路
- poj3311 哈密顿回路
- 哈密顿回路模版
- Hamilton-哈密顿回路
- 哈密顿回路
- 哈密顿回路
- POJ2438-求解哈密顿回路
- poj 2438哈密顿回路
- HDU4337(哈密顿回路)
- 哈密顿回路及解法
- 欧拉回路及哈密顿回路
- 哈密顿回路,状态dp poj2288
- 哈密顿回路-相异数字序列问题
- hdu3001(集合dp求哈密顿回路)
- hdu 4337 (哈密顿回路模板)
- hdu5418 最短哈密顿回路
- shell高效获取分割字符串
- POJ 1915 经典马步 双向bfs
- ios json 解析中文乱码问题
- Snap2HTML v1.51
- 一些有趣的网站
- poj3229 哈密顿回路
- awk怎样自定义变量以及常用bash传递的变量
- Unity3d 百度网盘资料分享
- Android主要包说明
- python入门
- [c#基础知识]浅谈Hashtable与Dictionary的异同
- VC实现程序重启的做法
- 在这里安个小窝
- 高效研发团队建设六步曲