HDU 1317 XYZZY(floyd+bellman_ford判环)
Posted 谦谦君子,陌上其华
tags:
篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了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 }
以上是关于HDU 1317 XYZZY(floyd+bellman_ford判环)的主要内容,如果未能解决你的问题,请参考以下文章
HDU 1317XYZZY spfa+判断正环+链式前向星(感觉不对,但能A)