UVA 10557-XYZZY
2016-08-12 21:40
921 查看
UVA 10557-XYZZY
题目大意:输入房间1~n,每个房间有能量,到那个房间需要加上能量,每个房间可以通往指定编号的房间,一开始能量为100在房间1,问能否到达房间n,中间能量不能小于等于0解题思路:先判断每个房间能通往那些房间,然后dfs,每次进入一个房间时记录当前房间能量,如果房间能通往房间n且进入能量大于记录中房间能量则dfs,中间要判断是否存在正环
#include <stdio.h> #include <iostream> #include <string.h> #include <sstream> using namespace std; int n; int room[1000][1000]; int num[1000]; int reach[1000][1000]; int en[1000]; int flag[1000]; void cir() { for(int k =1; k <= n; k++) for(int i = 1; i <= n; i++) for(int j = 1; j <= n; j++) if(reach[i][k] && reach[k][j]) reach[i][j] = 1; reach = 1; } int dfs(int a, int power) { if(power <= 0) return 0; if(a == n) return 1; for(int i = 1; i <= num[a]; i++) { int c; int b = room[a][i]; if(reach[b] && power + room[b][0] >= en[b]) { flag[b]++; if(flag[b] > 1) return 1; c = dfs(b, power+room[b][0]); if(c == 1) return 1; flag[b]--; en[b] = power + room[b][0]; } } return 0; } int main() { while(cin >> n && n >= 0) { memset(reach, 0, sizeof(reach)); memset(en, 0, sizeof(en)); memset(flag, 0, sizeof(flag)); for(int i = 1; i <= n; i++) { cin >> room[i][0]; cin >> num[i]; for(int j = 1; j <= num[i]; j++) { cin >> room[i][j]; int k = room[i][j]; reach[i][k] = 1; } } cir(); int s = 0; if(reach[1] ) s = dfs(1, 100); if(s == 1) printf("winnable\n"); else printf("hopeless\n"); } return 0; }
相关文章推荐
- UVA 10557 XYZZY
- uva- 10557 XYZZY
- uva 10557 - XYZZY
- UVA - 10557 XYZZY
- XYZZY - UVa 10557 图论
- UVA - 10557 XYZZY(DFS + BFS)
- uva 10557 - XYZZY
- UVA 10557 XYZZY
- uva 10557 - XYZZY (最长路)
- uva 10557 - XYZZY
- uva10557 XYZZY
- uva 10557 XYZZY(DFS+BFS)
- UVA 10557 XYZZY
- Uva 10557 XYZZY
- UVa 10557 - XYZZY
- uva 10557 XYZZY
- UVA 10557 XYZZY
- UVA 10557 XYZZY
- Uva 10557 - XYZZY(DFS+BFS)
- uva 10557 - XYZZY 关键词:正环,无敌bfs,单源最短路spfa算法