日韩性视频-久久久蜜桃-www中文字幕-在线中文字幕av-亚洲欧美一区二区三区四区-撸久久-香蕉视频一区-久久无码精品丰满人妻-国产高潮av-激情福利社-日韩av网址大全-国产精品久久999-日本五十路在线-性欧美在线-久久99精品波多结衣一区-男女午夜免费视频-黑人极品ⅴideos精品欧美棵-人人妻人人澡人人爽精品欧美一区-日韩一区在线看-欧美a级在线免费观看

歡迎訪問 生活随笔!

生活随笔

當前位置: 首頁 > 编程资源 > 编程问答 >内容正文

编程问答

HDU 1317 XYZZY(floyd+bellman_ford判环)

發布時間:2024/4/17 编程问答 32 豆豆
生活随笔 收集整理的這篇文章主要介紹了 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 }

?

轉載于:https://www.cnblogs.com/zyb993963526/p/6670359.html

總結

以上是生活随笔為你收集整理的HDU 1317 XYZZY(floyd+bellman_ford判环)的全部內容,希望文章能夠幫你解決所遇到的問題。

如果覺得生活随笔網站內容還不錯,歡迎將生活随笔推薦給好友。