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判环)相关推荐
- HDU 1217 Arbitrage (Floyd + SPFA判环)
题目链接:HDU 1217 Arbitrage 简单的货币转换问题,给定多种货币,以及货币之间的汇率,问能否通过货币的转换实现收益. 例如: 1 US Dollar buys 0.5 British ...
- hdu 1317 XYZZY【Bellheman_ford 判断正环小应用】
链接: http://acm.hdu.edu.cn/showproblem.php?pid=1317 http://acm.hust.edu.cn/vjudge/contest/view.action ...
- HDU 1317 XYZZY
大意:起始点100HP,给定n个房间,进入房间内加上或者减去 wHP,同一房间可以进入多次,问能否到达终点(HP大于0).起点0,终点n-1. 思路: 假设图中没有环,如果要到达终点,则需让剩下的HP ...
- hdu 1317——XYZZY
http://blog.csdn.net/dongshimou/article/details/35984917
- hdu 1625(floyd判环)
题目链接:http://acm.hdu.edu.cn/showproblem.php?pid=1625. 思路:大牛说是floyd判环,一想确实如此,我还一直在想如果用记忆化的怎么处理环呢...orz ...
- floyd判环算法(龟兔赛跑算法)
floyd判环算法(龟兔赛跑算法) 注意,这个算法是用来判断一条链+一条环的图,环的长度或者环与链的交界处的,所以此floyd非彼floyd(虽然都是一个人想出来的). (图不是我的) 如果只要求环的 ...
- Algorithm Set:floyd判环法
目录 1.1 适用情况 1.2 复杂度 1.3 判断是否存在环 1.4 找到环的入口 1.5 代码实现 1.1 适用情况 该算法用于解决一个数组/链表中是否存在环的情况! 1.2 复杂度 时间复杂度: ...
- hdu 3560(dfs判环)
题目链接:http://acm.hdu.edu.cn/showproblem.php?pid=3560 思路:dfs判环,这里成环的条件是环中的每个点的出度和入度都为1,因此dfs的时候只须判断的相连 ...
- Ice_cream's world I HDU - 2120(并查集判环)
题意:问给出的望塔之间的建造了围墙,将土地分成了几份 思路:用并查集判环,若有围墙相接的瞭望塔,有相同的父根,则存在环 ice_cream's world is a rich country, it ...
最新文章
- Pig自定义过滤UDF和加载UDF
- Java功底之static、final、this、super
- python中 和is的区别_关于python中的is和==的区别
- windows phone 学习之页面导航和数据传递
- flask与js交互的示例代码_dapr实战(1):dapr locally环境的搭建和部署官方的Hello world示例...
- windows+caffe下对CIFAR训练
- 我们变成了最小的,当我们发现不了最弱小的时候
- 前端http请求跨域问题解决
- 关于“指针数组”和”数组指针“
- 提示No input file specified的解决方法
- JavaScript版MD5应用
- ADS实验报告二:滤波器的仿真设计
- 百度搜索无法显示搜索结果
- 高通骁龙845的android手机有哪些,骁龙845手机买什么好 目前6款最值得买的骁龙845手机推荐...
- 非计算机,如何学习计算机视觉
- ffmpeg 用于转换视频格式的各种命令行
- u盘怎么装服务器系统教程,u盘装服务器系统教程
- 双非本科生进大厂,而我还在底层默默地爬树(上)
- coldfusion php,将一些PHP移植到ColdFusion
- Javascript-introduce
热门文章
- 启动标志_牛股启动的标志:天衣无缝。
- 透视映射和射影映射的关系 Perspective and Projectivity
- C++11强类型枚举,override/final
- c++ primer 5th第13章拷贝控制知识点和自编习题答案
- 概率论-4.2中心极限定理(待补充)
- c++11-final
- php日期提示警告,php程序报date()警告的处理的解决方法
- 用xfire开发webservice实例
- warning modified in the future
- 1万小时贫穷定律:为什么你越忙越穷?