UVA 11090 - Going in Cycle!!(最短路`Bellman-Ford)
来源:互联网 发布:单例模式 java enum 编辑:程序博客网 时间:2024/05/14 19:19
题目:
http://acm.hust.edu.cn/vjudge/contest/view.action?cid=74214#problem/E
题意:
求出有向图中环的 最小平均权值, 不成环则输出"No cycle found".
思路:
ford判负圈法+二分.
二分边的mid值, 若存在 c1+c2+..+ck < k*mid, (c1-mid)+(c2-mid)+...+(ck-mid) < 0,
则转化成 每条边cost - mid, 判断图中是否存在负圈.
AC.
#include <iostream>#include <cstdio>#include <cstring>using namespace std;const double esp = 1e-3;const int INF = 1e9;const int MAXM = 5005;int n, m;struct edge { int to, fm; double cost;}eg[MAXM];double d[55];bool find_negloop(){ memset(d, 0, sizeof(d)); for(int i = 0; i < n; ++i) { for(int j = 0; j < m; ++j) { edge e = eg[j]; if(d[e.to] > d[e.fm] + e.cost) { d[e.to] = d[e.fm] + e.cost; if(i == n-1) return true; } } } return false;}bool test(double mid){ for(int i = 0; i < m; ++i) { eg[i].cost -= mid; } bool ok = find_negloop(); for(int i = 0; i < m; ++i) { eg[i].cost += mid; } return ok;}int main(){//freopen("in", "r", stdin); int T, ca = 1; scanf("%d", &T); while(T--) { scanf("%d %d", &n, &m); int u, v; double c; double maxn = 0; for(int i = 0; i < m; ++i) { scanf("%d %d %lf", &u, &v, &c); eg[i].to = u; eg[i].fm = v; eg[i].cost = c; maxn = max(maxn, c); } printf("Case #%d: ", ca++); double l = 0, r = maxn+1; if(!test(r)) { printf("No cycle found.\n"); continue; } while(r - l > esp) { double mid = l + (r-l) / 2.0; //printf("%lf %lf %lf\n", l, mid, r); if(test(mid)) r = mid; else l = mid; } printf("%.2lf\n", l); } return 0;}
0 0
- UVA 11090 - Going in Cycle!!(最短路`Bellman-Ford)
- Uva 11090 - Going in Cycle!! bellman-ford 负权环 二分
- UVA - 11090 Going in Cycle!! (Bellman-Ford算法判负环)
- UVA 11090 - Going in Cycle!!(Bellman-Ford)
- UVA 11090 Going in Cycle!!(Bellman-Ford判断负圈)
- Uva 11090 Going in Cycle!!(二分+最短路)
- Bellman-Ford,最短路(在环中,UVA 11090)
- Uva 11090 Going in Cycle!!
- Uva-11090-Going in Cycle!!
- UVA 11090 - Going in Cycle!!
- uva 11090 Going in Cycle!!
- UVA - 11090-Going in Cycle!!
- UVA 11090 Going in Cycle!!
- uva 11090 Going in Cycle!!
- UVA 11090 Going in Cycle!!
- UVA 11090 Going in Cycle!!
- UVA 11090 Going in Cycle!!
- 最短路 bellman-ford
- MySQL中找出数据库中表名以cf_打头的所有表的方法
- Combination Sum II 全排列求和无重复
- java自学笔记————IO流中的键盘输入流和输出流详解;
- [LeetCode] Number of Islands
- nyoj 104 最大和 【压缩矩阵 DP求最大连续子序列的和】
- UVA 11090 - Going in Cycle!!(最短路`Bellman-Ford)
- 非常有用的android控件编程
- [转]python 大文件以行为单位读取方式比对
- 约瑟夫环问题
- 关于CoreData和SQLite多线程访问时的线程安全问题
- HDU 4821 String (2013长春现场赛I题) 字符串Hash
- Linux基础:如何找出你的系统所支持的最大内存
- Multiply Strings 大数相乘
- rt-thread学习笔记开篇