Uva10557XYZZY
来源:互联网 发布:qq飞车幻灵奇迹数据 编辑:程序博客网 时间:2024/06/16 04:21
题意,进出房间需要消耗能量,问你时候可以经过一些房间从而到达终点
注意:1房间可以无限次进出;
2 成功条件
1》 只要存在正环并且这个环内任意一个点可以通向终点的话就一个可以成功
2》一条路走到终点
#include <iostream>
#include <stdio.h>#include <stdlib.h>
#include <string.h>
using namespace std;
bool map[105][105];
int val[105];
int aft[105];
bool vis[105];
int que[105];
int n;
//看经过回路内的点否能到达终点
bool bfs( int u)
{
int head = 0, tail = 0;
que[tail++] = u;
memset(vis ,0, sizeof(vis));
vis[u] = true;
while(head < tail)
{
int now = que[head++];
for( int i = 0; i < n; i++)
{
if(map[now][i] && !vis[i])
{
if(i == n - 1)
return true;
que[tail++]= i;
vis[i] = true;
}
}
}
return false;
}
bool dfs( int u, int e)
{
if( u == n - 1)//访问到终点
return true;
for( int i = 0; i < n; i++)
{
if(map[u][i] && e + val[i] > 0)
{
if(!aft[i])//没有回路继续访问
{
aft[i] = e + val[i];
if(dfs(i, aft[i]))
return true;
}
else if(e + val[i] > aft[i] && bfs(i))//存在正回路且经过这个回来可以到达终点
return true;
}
}
return false;
}
int main()
{
int m,res, x;
while(scanf("%d",&n) &&( n != -1))
{
memset(val, 0, sizeof(val));
memset(vis, 0, sizeof(vis));
memset(map, 0, sizeof(map));
for( int i =0 ; i < n; i++)
{
scanf("%d%d",&val[i], &m);
for( int j = 0; j < m ; j++)
{
scanf("%d",&x);
map[i][x-1] = true;
}
}
memset(aft, 0, sizeof(aft));
printf("%s\n",dfs(0,100)?"winnable":"hopeless");
}
return 0;
}
0 0
- Uva10557XYZZY
- UVA10557XYZZY(DFS+BFS 与 SPFA 两种做法)
- Linked List Cycle II
- Learn Beautiful Soup(5) —— 使用BeautifulSoup改变网页内容
- please set a system env PAODING_DIC_HOME or Config paoding.dic.home in paoding-dic-home.properties p
- Clustering of residential areas based on residential conditions
- Java学习第一例:HelloWorld
- Uva10557XYZZY
- 康托展开及其逆运算
- 回收进程用户空间资源 exit()函数 _exit()函数 atexit()函数 on_exit()函数
- CMakeLists.txt与Makefile 的区别
- 云计算厂商应该避免的3种销售和市场手段
- 聚类之K-means均值聚类
- 597- 使用的hint 自相矛盾
- 互联网协议入门
- VirtualBox + Android-x86 配置全攻略