码迷,mamicode.com
首页 > 其他好文 > 详细

HDU 1317 XYZZY(floyd+bellman_ford判环)

时间:2017-04-05 22:28:31      阅读:261      评论:0      收藏:0      [点我收藏+]

标签:i++   vector   lag   algorithm   tar   else   als   targe   break   

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 }

 

HDU 1317 XYZZY(floyd+bellman_ford判环)

标签:i++   vector   lag   algorithm   tar   else   als   targe   break   

原文地址:http://www.cnblogs.com/zyb993963526/p/6670359.html

(0)
(0)
   
举报
评论 一句话评论(0
登录后才能评论!
© 2014 mamicode.com 版权所有  联系我们:gaon5@hotmail.com
迷上了代码!