UVA 11090 Going in Cycle!!(二分 + spfa 判负环)
来源:互联网 发布:依云软件 编辑:程序博客网 时间:2024/05/30 04:42
题目:http://uva.onlinejudge.org/index.php?option=com_onlinejudge&Itemid=8&page=show_problem&problem=2031
题目大意:给你一个n个点,m条边的有向图。问你平均权值最小的有向环。输出这个平均权值。
解题思路:问你这个权值,二分答案是很容易想到的,然后对每条边 - mid,再 spfa 判负环。还有就是要先判断他是不是本来就没有环吗,强连通当然可以,不过对于这道题目,这种更好:设最大的边权是max_c,然后把每条边的边权都 - (max_c+1),用 spfa 看看有没有负环。这里的权值是浮点数,所以二分要用double,之前没怎么写过double 的二分,按照写整型一样的写,WA了,改精度,改为 1e-4 ,还是WA。用书上的写法写了一遍,A了。。
求神牛看看我这么写为什么WA?3Q~~~
我写的二分:
double l = 0,r = max_c;double ans;while(r-l >= EPS){ double mid = (l+r)/2; if(check(mid,n)) { ans = mid; r = mid-EPS; } else l = mid+EPS;}printf("%.2f\n",ans);
书上的二分:
double l = 0,r = max_c;while(r-l > EPS){ double mid = l+(r-l)/2; if(check(mid,n)) { r = mid; } else l = mid;}printf("%.2f\n",l);
代码如下:
#include<cstdio>#include<cstring>#include<queue>#include<algorithm>using namespace std;const int MAXN = 55;const int MAXM = MAXN*MAXN;const double EPS = 1e-3;struct Edge{ int t,next; double val;} edge[MAXM];int head[MAXN],tot;void init(){ tot = 0; memset(head,-1,sizeof(head));}void add_edge(int s,int t,double val){ edge[tot].t = t; edge[tot].val = val; edge[tot].next = head[s]; head[s] = tot++;}bool inq[MAXN];int cnt[MAXN];double d[MAXN];int spfa(int n){ queue<int> q; memset(inq,0,sizeof(inq)); memset(cnt,0,sizeof(cnt)); for(int i = 1;i <= n;i++) { d[i] = 0; inq[i] = 1; q.push(i); } while(!q.empty()) { int cur = q.front(); q.pop(); inq[cur] = 0; for(int i = head[cur]; i != -1;i = edge[i].next) { int next_id = edge[i].t; double val = edge[i].val; double tmp = d[cur]+val; if(tmp < d[next_id]) { d[next_id] = tmp; if(!inq[next_id]) { q.push(next_id); inq[next_id] = 1; if(++cnt[next_id] > n) return 1; } } } } return 0;}int check(double mid,int n){ for(int i = 0;i < tot;i++) edge[i].val -= mid; int ok = spfa(n); for(int i = 0;i < tot;i++) edge[i].val += mid; return ok;}int main(){ int cas = 0; int _; scanf("%d",&_); while(_--) { int n,m; scanf("%d%d",&n,&m); init(); int max_c = 0; while(m--) { int a,b,c; scanf("%d%d%d",&a,&b,&c); add_edge(a,b,c); max_c = max(max_c,c); } printf("Case #%d: ",++cas); if(!check(max_c+1,n)) { puts("No cycle found."); continue; } double l = 0,r = max_c; while(r-l > EPS) { double mid = (l+r)/2; if(check(mid,n)) { r = mid; } else l = mid; } printf("%.2f\n",l); } return 0;}
0 0
- UVA 11090 Going in Cycle!!(二分 + spfa 判负环)
- UVA 11090 Going in Cycle!!(二分 + spfa)
- UVA 11090Going in Cycle!! (spfa + 二分)
- UVA 11090 Going in Cycle!! SPFA判断负环+二分
- Going in Cycle!!+二分答案+spfa判负环+裸题+uva
- uva11090 Going in Cycle!! --- 二分+spfa判负环
- UVA 11090 - Going in Cycle!! SPFA
- UVA 11090 Going in Cycle!(BellmanFord+二分)
- uva 11090 - Going in Cycle!!(二分+BellmanFord)
- UVa 11090 Going in Cycle!!(环上平均值最大+SPFA DFS判负环)
- UVA11090 Going in Cycle!! 解题报告【判负环】【SPFA】【二分答案】
- UVA 11090 Going in Cycle!! SPFA判断负圈
- Uva 11090 - Going in Cycle!! bellman-ford 负权环 二分
- 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!!
- 搜索引擎 url 提交入口网址
- vC2010应用程序的控件风格与设计时显示一致解决方案
- 面试中常考的EJB知识以及Weblogic知识
- 消息称被撤职政协委员刘迎霞卷入中石油腐败窝案
- SOCK_RAW PF_PACKET IPv6带物理地址发送报文
- UVA 11090 Going in Cycle!!(二分 + spfa 判负环)
- MFC 移动控件到指定位置
- 【Android UI设计与开发】第17期:滑动菜单栏(二)开源项目SlidingMenu的示例
- linux下面快速删除大量文件及快速复制大量小文件
- ListView子控件获取焦点问题
- Linux 内核网络协议栈 ------ 数据从接收到ip层
- Android 防止按钮控件被重复点击
- 结婚那点事儿
- 开发笔记之20140303