hdu 4284Travel(状压dp 或 floyd+dfs)
2015-12-11 20:32
316 查看
题目链接:【hdu 4284】
一、floyd+dfs
二、状压dp
一、floyd+dfs
<span style="font-size:14px;">#include <iostream> #include <algorithm> #include <cstdio> #include <cstring> #include <string> using namespace std; #define inf 0x3f3f3f3f struct T { int id, ci, di; }p[110]; int f[110][110], vis[110], h; bool dfs(int li, int money, int num) { if(num==h) { if(money-f[li][1]>0) return true; else return false; } for(int i=1; i<=h; i++) { int ans=money-f[li][p[i].id]-p[i].di; if(vis[i]==0&&ans>=0) { vis[i]=1; if(dfs(p[i].id, money-f[li][p[i].id]-p[i].di+p[i].ci, num+1)) return true; vis[i]=0; } } return false; } int main() { int t; scanf("%d", &t); while(t--) { int n, m, money; scanf("%d%d%d", &n, &m, &money); for(int i=1; i<=n; i++) { for(int j=1; j<=n; j++) { if(i==j) f[i][j]=0; else f[i][j]=inf; } } for(int i=1; i<=m; i++) { int u, v, c; scanf("%d%d%d", &u, &v, &c); f[u][v]=f[v][u]=min(f[u][v], c);//考虑重边 } scanf("%d", &h); for(int i=1; i<=h; i++) { scanf("%d%d%d", &p[i].id, &p[i].ci, &p[i].di); } for(int k=1; k<=n; k++) { for(int i=1; i<=n; i++) { for(int j=1; j<=n; j++) { f[i][j] = min(f[i][j], f[i][k]+f[k][j]); } } } memset(vis, 0, sizeof(vis)); if(dfs(1, money, 0)) printf("YES\n"); else printf("NO\n"); } return 0; } </span>
二、状压dp
#include <iostream> #include <algorithm> #include <cstdio> #include <cstring> #include <string> using namespace std; #define inf 0x3f3f3f3f struct T { int id, ci, di; }p[110]; int f[110][110], h, dp[(1<<16)+10][30]; int main() { int t; scanf("%d", &t); while(t--) { int n, m, money; memset(dp, -1, sizeof(dp)); scanf("%d%d%d", &n, &m, &money); for(int i=1; i<=n; i++) { for(int j=1; j<=n; j++) { if(i==j) f[i][j]=0; else f[i][j]=inf; } } for(int i=1; i<=m; i++) { int u, v, c; scanf("%d%d%d", &u, &v, &c); f[u][v]=f[v][u]=min(f[u][v], c);//考虑重边 } for(int k=1; k<=n; k++) { for(int i=1; i<=n; i++) { for(int j=1; j<=n; j++) { f[i][j] = min(f[i][j], f[i][k]+f[k][j]); } } } scanf("%d", &h); for(int i=0; i<h; i++) { scanf("%d%d%d", &p[i].id, &p[i].ci, &p[i].di); int mm=money-f[1][p[i].id]-p[i].di; if(mm>=0) dp[1<<i][i]=mm+p[i].ci; } int st=1<<h; for(int i=1; i<st; i++) { for(int j=0; j<h; j++) { if(dp[i][j]==-1) continue; for(int k=0; k<h; k++) { if(i&(1<<k)) continue; int mm=dp[i][j]-f[p[j].id][p[k].id]-p[k].di; if(mm>=0) dp[i|(1<<k)][k]=max(dp[i|(1<<k)][k], mm+p[k].ci); } } } int mm=-1; for(int i=0; i<h; i++) { mm=max(dp[st-1][i]-f[p[i].id][1], mm); } if(mm==-1) printf("NO\n"); else printf("YES\n"); } return 0; }
相关文章推荐
- 判断闰年
- Partition table的switch条件1:结构相同(类型,nullability)
- UILabel的size根据文字的长短变化
- H264,aac rtmp
- 数据结构再学习-散列表(哈希表)实现
- 循环删除List集合的错误
- 欢迎使用CSDN-markdown编辑器
- bzoj3309 DZY Loves Math 数论
- 阅读分词核心代码的 几点感触
- ERP调研之 对话
- 【C++ in Qt5】一个简单的通讯录程序,支持文件存取
- 转: 利用 DEBUG_NEW 来追溯 Memory leak 内存泄漏
- java Socket双向交互获取输入信息
- leetcode Multiply Strings
- java学习笔记之vector的排序
- ubuntu12.04安装gcc、gdb和arm-Linux-gcc4.4.3
- 控制台屏幕缓冲区
- unicode字符串解码显示
- Android 异步消息处理机制 让你深入理解 Looper、Handler、Message三者关系
- 游戏服务器架构