HDU 1317 XYZZY(floyd+bellman_ford判环)

http://acm.hdu.edu.cn/showproblem.php?pid=1317

题意:

给出一个有向图,每到达一个点,都会加上或减去一些能量,我们要做的就是判断从1出发是否能到达n。初始能量有100,行走的途中能量不能小于等于0。

思路:

首先我们用floyd来判断一下1和n之间是否有通路。

其次就是bellman_ford算法来判正环了。

 1 #include <iostream>
 2 #include <cstring>
 3 #include <algorithm>
 4 #include <vector>
 5 #include <queue>
 6 #include <cmath>
 7 using namespace std;
 8
 9 const int maxn = 10000 + 5;
10 const int INF = 0x3f3f3f3f;
11
12 int n, m;
13 int power[105];
14 int d[105][105];
15 int en[105];
16 int cnt;
17
18 struct node
19 {
20     int s, e;
21 }edge[maxn];
22
23 void floyd()
24 {
25     for (int k = 1; k <= n; k++)
26     for (int i = 1; i <= n; i++)
27     for (int j = 1; j <= n; j++)
28     {
29         d[i][j] = d[i][j] || (d[i][k] && d[k][j]);
30     }
31 }
32
33 bool bellman_ford()
34 {
35     for (int i = 1; i <= n; i++)   en[i] = -INF;
36     en[1] = 100;
37     for (int i = 1; i < n; i++)
38     {
39         bool flag = false;
40         for (int j = 0; j <cnt; j++)
41         {
42             if (en[edge[j].e] < en[edge[j].s] + power[edge[j].e] && en[edge[j].s]+power[edge[j].e]>0)
43             {
44                 en[edge[j].e] = en[edge[j].s] + power[edge[j].e];
45                 flag = true;
46             }
47         }
48         if (!flag)  break;
49     }
50     for (int j = 0; j < cnt; j++)
51     {
52         //这儿需要注意一下,判断正环的时候,这个正环必须能到达终点
53         if (en[edge[j].e] < en[edge[j].s] + power[edge[j].e] && en[edge[j].s] + power[edge[j].e]>0 && d[edge[j].e][n])  return true;
54     }
55     if (en[n] <= 0)     return false;
56     else return true;
57 }
58
59
60 int main()
61 {
62     //freopen("D:\\input.txt", "r", stdin);
63     int v;
64     while (cin >> n && n != -1)
65     {
66         memset(d, 0, sizeof(d));
67         cnt = 0;
68
69         for (int i = 1; i <= n; i++)
70         {
71             scanf("%d%d", &power[i], &m);
72             while (m--)
73             {
74                 scanf("%d", &v);
75                 edge[cnt].s = i;
76                 edge[cnt].e = v;
77                 d[i][v] = 1;
78                 cnt++;
79             }
80         }
81         floyd();     //首先判断1到n是否连通
82         if (!d[1][n])
83         {
84             printf("hopeless\n");
85             continue;
86         }
87         if (bellman_ford())
88             printf("winnable\n");
89         else
90             printf("hopeless\n");
91     }
92 }
时间: 2025-01-01 12:26:36

HDU 1317 XYZZY(floyd+bellman_ford判环)的相关文章

HDU 1317 XYZZY【Bellman_Ford判断正环】

题意:给出n个房间,初始在房间1有100的能量值,每次进入一个房间,能量值可能增加也可能减小,(是点权,不是边权),问能否到达终点的时候能量值还为正 这题自己写的时候wa--wa-- 后来看了题解,还是wa---wa--- 题解很详细http://blog.csdn.net/freezhanacmore/article/details/9937327 记录下自己犯的错误吧 首先是floyd函数初始化的时候,直接写在了函数里面,这样是不对的,因为输入值在前,调用函数在后,这样就相当于将之前输入的可

HDU - 1317 XYZZY (floyd + 最长路)

题目大意:有一种游戏,游戏里面有N个房间,每个房间有相应的能量值,走入该房间就可以得到相应的能量值 现在你要从房间1出发,走到房间N,如果中途能量耗尽了,就表示输了,反之,则为赢 解题思路:首先得判断一下能不能到达N,这可以用Floyd去判断 如果能直接走到N的话,就算赢,否则判断一下,看是否有正环,且正环中有点能到N #include <cstdio> #include <cstring> #include <algorithm> #include <vecto

hdu 1317 XYZZY(spfa判环)

http://acm.hdu.edu.cn/showproblem.php?pid=1317 大致题意:有n个房间,每个房间都有对应的能量值(可正可负),现在从1出发要到达n,初始能量为100,问是否能够达到n点,到达n的条件是中间及最后的能量值都要大于0. 思路:若不考虑环,那么求最长路判断是否大于0即可.若存在负环,对求最长路也没影响:但当存在正环时,最长路就不存在了.可用spfa判断,当某点入队超过n次,那么它必定在环中,直接将其dis置为INF,并不再将其近队列.最后若能到达n则可行,否

HDU 1317 XYZZY

题意是指 从1 到 N 能否保证 到达每个点的时候 能量都为正数. 起点 1 初始100 点能量. 输入是 从 1 ~ N , 分别是 能量,能到m个房间, 分别是 a1,a2,a3,-,am 可以给每个能到达的点 而 产生的边赋权,即能量值. SPFA 求最长路的变形,出现负环不怕,出现正环就需要一点改动. vis[]标记是否需要入队,d[] 表示能量,que[] 表示入队次数. 如果出现正环(que[v]>=n),表明一定能 保证到达每个点的时候都是正能量. 这时候直接 将 d[v] 赋最大

hdu 1625 Numbering Paths 最短路的变形,使用Floyd 外加判环

Numbering Paths Time Limit: 2000/1000 MS (Java/Others)    Memory Limit: 65536/32768 K (Java/Others) Total Submission(s): 158    Accepted Submission(s): 47 Problem Description Problems that process input and generate a simple ``yes'' or ``no'' answer

HDU 1317 XYZZY (SPFA 找正环 + Floyd 判连通)

XYZZY Time Limit: 2000/1000 MS (Java/Others)    Memory Limit: 65536/32768 K (Java/Others) Total Submission(s): 3004    Accepted Submission(s): 817 Problem Description It has recently been discovered how to run open-source software on the Y-Crate gami

hdu 1317 XYZZY 国产SPFA算法AC,,题目输入部分真特么难懂。。内有解析

XYZZY Time Limit: 2000/1000 MS (Java/Others)    Memory Limit: 65536/32768 K (Java/Others) Total Submission(s): 3017    Accepted Submission(s): 824 Problem Description It has recently been discovered how to run open-source software on the Y-Crate gami

hdu1317 XYZZY Floyd + Bellman_Ford

这题,我在学搜索的时候做过.不过好像不叫这名字. 1.先用Floyd算法判断图的连通性.如果1与n是不连通的,输出hopeless. 2.用Bellman_Ford算法判断是否有正圈,如果某点有正圈,并且该点与第n点是连通的.就输出winnable.当然,没有正圈的情况下,可以到达也是可以的.然后就是如何找正圈的问题.Bellman_Ford算法可以判断有没有负圈.Bellman_Ford是解决最短路问题的,核心是松弛法.如果dist[v]<dist[u]+Map[u][v],则dist[v]=

HDU 3592 查分约束+判环

点击打开链接 题意:有N个人,然后X个关系和Y个关系,X关系代表的是这两个人的距离不能超过C,Y代表的是这两个人的距离要大于等于C,若不能满足所有的输出-1,若1与N的位置可以无穷大输出-2,否则输出两个人的最大距离 思路:就是查分约束的模型,X个关系按照位置建边,Y也是直接按位置建边就行了,就是两个初始方向不同,然后有负环的话就输出-1,距离无穷大输出-2,否则就是dis[N]的值就行了,自己讨论一下就可以出来了 #include <stdio.h> #include <string.