您的位置:首页 > 其它

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 dfs