Uva 10557 XYZZY
来源:互联网 发布:iphone桌面软件管理 编辑:程序博客网 时间:2024/06/05 07:24
https://uva.onlinejudge.org/index.php?option=com_onlinejudge&Itemid=8&page=show_problem&problem=1498
题意的意思是给你n个房间,每个房间有一个价值,每个房间可以通向一些其他的房间,然后每个房间可以访问多次= =里面的价值也可以多次取,问你是否能够从1房间走到n房间,走的路程中价值要大于0,初始的价值为100。。
这题说到底还是搜索。。。。但是当图中存在正环的时候,那么就可以直接从搜索所有路径看是否存在到终点的路径,如果不存在的话,就老老实实搜索是否能够保持在大于0的价值走到终点
#include<stdio.h>#include<string.h>#include<iostream>#include<algorithm>#include<queue>#include<vector>using namespace std;int n;int a[150];int vis[150];int d[150];vector<int>V[150];int dfs(int u){ if(u==n) return 1; vis[u]=1; for(int i=0;i<V[u].size();i++) { int v=V[u][i]; if(!vis[v]) { if(dfs(v)) return 1; } } return 0;}int DFS(int u,int E){ if(u==n) return 1; d[u]=E+a[u]; for(int i=0;i<V[u].size();i++) { int v=V[u][i]; if(d[u]+a[v]>0) { if(!d[v])//表示v未访问过 ,直接访问 { if(DFS(v,d[u])) return 1; } else if(d[u]+a[v]>d[v])//访问过,看看是否能够成正环,如果能成正环,直接从该点搜索看是否能够到达重点 { memset(vis,0,sizeof(vis)); if(dfs(v)) return 1; } } } return 0;}int main(){ int m,k; while(scanf("%d",&n)!=EOF&&n!=-1) { memset(a,0,sizeof(a)); memset(d,0,sizeof(d)); for(int i=1;i<=n;i++) V[i].clear(); for(int i=1;i<=n;i++) { scanf("%d",&a[i]); scanf("%d",&m); for(int j=0;j<m;j++) { scanf("%d",&k); V[i].push_back(k); } } if(DFS(1,100)) { printf("winnable\n"); } else printf("hopeless\n"); } return 0;}
0 0
- UVa 10557 - XYZZY
- uva 10557 - XYZZY
- UVA 10557 XYZZY
- uva 10557 - XYZZY
- UVA 10557 XYZZY
- UVA 10557 XYZZY
- UVA - 10557 XYZZY
- UVA 10557 - XYZZY
- XYZZY - UVa 10557 图论
- UVA 10557 XYZZY
- UVa 10557 - XYZZY
- UVA 10557 XYZZY
- Uva 10557 XYZZY
- UVA 10557-XYZZY
- UVA - 10557 XYZZY
- uva 10557 - XYZZY hdu 1317
- UVa 10557 & HDU 1317 - XYZZY
- uva 10557 XYZZY(DFS+BFS)
- 1092 回文字符串(51nod)
- B. Bear and Three Musketeers
- Uva657 - The die is cast
- Uva532(三维搜索)
- Uva 705 - Slash Maze
- Uva 10557 XYZZY
- Uva 10004(二分图的判定)
- 右值与左值解析
- Uva(10129)+Uva(10054)
- 二叉排序树的建立
- zoj(1221
- Uva(10305)
- Uva(10034)
- HDU(1087)继续畅通工程