hdu 1932(spfa)

XYZZY

Time Limit: 1000MS   Memory Limit: 30000K
Total Submissions: 3694   Accepted: 1059

Description

The prototypical computer adventure game, first designed by Will Crowther on the PDP-10 in the mid-1970s as an attempt at computer-refereed fantasy gaming, and expanded into a puzzle-oriented game by Don Woods at Stanford in 1976. (Woods had been one of the authors of INTERCAL.) Now better known as Adventure or Colossal Cave Adventure, but the TOPS-10 operating system permitted only six-letter filenames in uppercase. See also vadding, Zork, and Infocom.

It has recently been discovered how to run open-source software on
the Y-Crate gaming device. A number of enterprising designers have
developed Advent-style games for deployment on the Y-Crate. Your job is
to test a number of these designs to see which are winnable.

Each game consists of a set of up to 100 rooms. One of the rooms is
the start and one of the rooms is the finish. Each room has an energy
value between -100 and +100. One-way doorways interconnect pairs of
rooms.

The player begins in the start room with 100 energy points. She may
pass through any doorway that connects the room she is in to another
room, thus entering the other room. The energy value of this room is
added to the player‘s energy. This process continues until she wins by
entering the finish room or dies by running out of energy (or quits in
frustration). During her adventure the player may enter the same room
several times, receiving its energy each time.

Input

The
input consists of several test cases. Each test case begins with n, the
number of rooms. The rooms are numbered from 1 (the start room) to n
(the finish room). Input for the n rooms follows. The input for each
room consists of one or more lines containing:

  • the energy value for room i
  • the number of doorways leaving room i
  • a list of the rooms that are reachable by the doorways leaving room i

The start and finish rooms will always have enery level 0. A line containing -1 follows the last test case.

Output

In one line for each case, output "winnable" if it is possible for the player to win, otherwise output "hopeless".

Sample Input

5
0 1 2
-60 1 3
-60 1 4
20 1 5
0 0
5
0 1 2
20 1 3
-60 1 4
-60 1 5
0 0
5
0 1 2
21 1 3
-60 1 4
-60 1 5
0 0
5
0 1 2
20 2 1 3
-60 1 4
-60 1 5
0 0
-1

Sample Output

hopeless
hopeless
winnable
winnable
题意:某人从 1走到 n,初始值为100,经过的每个点都有一个能量值,他走到每个点时会增加或者减少这个点的能量值,但是都不能小于 0 ,问他最后能否走到第n个点?题解:spfa 判断正环,如果某个点的入队次数>n,那么则证明这个数赋值 INF ,然后这个点就不能进入了,然后每一次要判断是否大于 0 
#include <iostream>
#include <cstdio>
#include <string.h>
#include <queue>
#include <algorithm>
#include <math.h>
using namespace std;
typedef long long LL;
const int INF = 999999999;
const int N = 205;
const int M = N*N;
struct Edge{
    int v,next;
}edge[M];
int head[N];
int tot;
int n;
int val[N];
void addEdge(int u,int v,int &k){
    edge[k].v = v,edge[k].next = head[u],head[u] = k++;
}
void init(){
    memset(head,-1,sizeof(head));
    tot = 0;
}
int low[N],time[N],pre[N];
bool vis[N];
bool spfa(int s){
    for(int i=1;i<=n;i++){
        vis[i] = false;
        low[i] = -INF;
        time[i] = 0;
        pre[i] = i;
    }
    low[s] = 100;
    time[s]++;
    queue<int> q;
    q.push(s);
    while(!q.empty()){
        int u = q.front();
        q.pop();
        vis[u] = false;
        if(time[u]>n) low[u] = INF;
        for(int k = head[u];k!=-1;k=edge[k].next){
            int v = edge[k].v;
            if(low[v]<low[u]+val[v]&&low[u]+val[v]>0){
                low[v] = low[u]+val[v];
                if(!vis[v]&&time[v]<=n){
                    vis[v] = true;
                    q.push(v);
                    time[v]++;
                }
            }
        }
    }
    int temp = n;
    if(low[n]<=0) return false;
    return true;
}
int main(){
    while(scanf("%d",&n)!=EOF,n!=-1){
        init();
        int num;
        for(int u=1;u<=n;u++){
            scanf("%d%d",&val[u],&num);
            for(int j=1;j<=num;j++){
                int v;
                scanf("%d",&v);
                addEdge(u,v,tot);
            }
        }
        if(spfa(1)) printf("winnable\n");
        else printf("hopeless\n");
    }
    return 0;
}
时间: 2024-11-05 06:06:34

hdu 1932(spfa)的相关文章

HDU 1847(SPFA)

高仿代码: #include <iostream>#include <string.h>#include <queue>#include <vector>#include <utility>#include <cstdio>using namespace std;#define N 205#define M 2005const int inf = 0x3f3f3f3f;int v[M],w[M],next[M],first[N],d[

hdu 4568 spfa 最短路算法+旅行商问题

http://acm.hdu.edu.cn/showproblem.php?pid=4568 Problem Description One day, a hunter named James went to a mysterious area to find the treasures. James wanted to research the area and brought all treasures that he could. The area can be represented a

HDU 2112 HDU Today &lt;SPFA算法+map函数&gt;

HDU Today Time Limit: 15000/5000 MS (Java/Others)    Memory Limit: 32768/32768 K (Java/Others) Total Submission(s): 19826    Accepted Submission(s): 4671 Problem Description 经过锦囊相助,海东集团终于度过了危机,从此,HDU的发展就一直顺风顺水,到了2050年,集团已经相当规模了,据说进入了钱江肉丝经济开发区500强.这时候

HDU 1874 SPFA/BellmanFord/Dijkstra/Floyd

这题作为模板题,解法好多... 最近周围的人都在搞图论阿,感觉我好辣鸡,只会跟风学习. 暂时只有SPFA的 SPFA (邻接表版.也可以写成临接矩阵存图,但题目可能给出平行边的,所以要注意找最小的边储存,还要注意判断一个点是否多次进入队列)老实说觉得SPFA好像只是被队列优化过的搜索一样的.. 1 #include <stdio.h> 2 #include <algorithm> 3 #include <iostream> 4 #include <string.h

hdu 3786(SPFA+dfs)

#include <iostream> #include <cstring> #include <algorithm> #include <cstdio> #include <queue> using namespace std; const int maxn=100000+10; const int inf=999999999; int hade1[maxn],hade2[20]; struct note { int next,e,w; };

UVALive 4223 / HDU 2962 spfa + 二分

Trucking Problem Description A certain local trucking company would like to transport some goods on a cargo truck from one place to another. It is desirable to transport as much goods as possible each trip. Unfortunately, one cannot always use the ro

hdu 1317 SPFA+连通判断+最长路

Description It has recently been discovered how to run open-source software on the Y-Crate gaming device. A number of enterprising designers have developed Advent-style games for deployment on the Y-Crate. Your job is to test a number of these design

Mining Station on the Sea (hdu 2448 SPFA+KM)

Mining Station on the Sea Time Limit: 5000/1000 MS (Java/Others)    Memory Limit: 32768/32768 K (Java/Others) Total Submission(s): 2584    Accepted Submission(s): 780 Problem Description The ocean is a treasure house of resources and the development

Key Vertex (hdu 3313 SPFA+DFS 求起点到终点路径上的割点)

Key Vertex Time Limit: 10000/5000 MS (Java/Others)    Memory Limit: 65536/65536 K (Java/Others) Total Submission(s): 1347    Accepted Submission(s): 305 Problem Description You need walking from vertex S to vertex T in a graph. If you remove one vert