题意:

  给定一个n个点m条边的带权有向图,求平均权值最小的回路的平均权值?

思路:

  首先,图中得有环的存在才有解,其次再解决这个最小平均权值为多少。一般这种就是二分猜平均权值了,因为环在哪也难以找出来,还有可能是一条边属于多个环。对于每个猜到的平均值,如果对应环的存在,那么这个环的每条边的权减去这个平均值之后,用spfa算法就能判断其是否有环的存在即可。

  假设环上各边权值为:w1+w2+...+wk。

  式子:w1+w2+...+wk<k*even   相当于   (w1-even)+(w2-even)+...(wk-even)< 0。即更新完边权后应i该是有环存在的。

  对于猜测的平均权值mid,如果不能找到环,则说明mid应该更大。

  1. #include <bits/stdc++.h>
  2. #define LL long long
  3. #define pii pair<int,int>
  4. #define INF 0x7f7f7f7f
  5. using namespace std;
  6. const int N=;
  7. vector<int> vect[N];
  8. struct node
  9. {
  10. int from,to;
  11. double cost;
  12. node(){};
  13. node(int from,int to,int cost):from(from),to(to),cost(cost){};
  14. }edge[N];
  15. int edge_cnt;
  16. int big, small;
  17. void add_node(int from,int to,double cost)
  18. {
  19. edge[edge_cnt]=node(from, to, cost);
  20. vect[from].push_back(edge_cnt++);
  21. }
  22.  
  23. int inq[N], cnt[N];
  24. double dist[N];
  25. bool spfa(int n, double q)
  26. {
  27. memset(inq,,sizeof(inq));
  28. memset(cnt,,sizeof(cnt));
  29. deque<int> que;
  30. for(int i=; i<=n; i++) dist[i]=0.0, inq[i]=, que.push_back(i); //因为是判断负环的,所以dist初始化为0即可。
  31. while(!que.empty())
  32. {
  33. int x=que.front();que.pop_front();
  34. inq[x]=;
  35. for(int i=; i<vect[x].size(); i++)
  36. {
  37. node e=edge[vect[x][i]];
  38. if(dist[e.to]>dist[x]+e.cost-q )
  39. {
  40. dist[e.to]=dist[x]+e.cost-q ;
  41. if(!inq[e.to])
  42. {
  43. inq[e.to]=;
  44. que.push_back(e.to);
  45. if(++cnt[e.to]>n)
  46. return true;
  47. }
  48. }
  49. }
  50. }
  51. return false;
  52. }
  53.  
  54. double cal(int n)
  55. {
  56. double l=small, r=big, ans=0.0;
  57. while(r-l>1e-)
  58. {
  59. double mid=(l+r)/;
  60. if( spfa(n, mid) ) r=mid; //有负环
  61. else l=mid;
  62. }
  63. return l;
  64. }
  65.  
  66. int main()
  67. {
  68. // freopen("input.txt", "r", stdin);
  69. int n, m, t, a, b, c, j=;
  70. cin>>t;
  71. while(t--)
  72. {
  73. scanf("%d%d",&n,&m);
  74. edge_cnt=;
  75. for(int i=; i<=n; i++) vect[i].clear();
  76. memset(edge,,sizeof(edge));
  77. big=;
  78. small=INF;
  79.  
  80. for(int i=; i<m; i++)
  81. {
  82. scanf("%d%d%d",&a,&b,&c);
  83. add_node(a,b,c);
  84. small=min(small,c);
  85. big=max(big, c);
  86. }
  87. if( !spfa(n, big+) ) printf("Case #%d: No cycle found.\n", ++j);
  88. else printf("Case #%d: %.2f\n", ++j, cal(n));
  89. }
  90. return ;
  91. }

AC代码

UVA 11090 Going in Cycle!! 环平均权值(bellman-ford,spfa,二分)的更多相关文章

  1. UVA 11090 Going in Cycle!!(二分答案+判负环)

    在加权有向图中求平均权值最小的回路. 一上手没有思路,看到“回路”,第一想法就是找连通分量,可又是加权图,没什么好思路,那就转换题意:由求回路权值->判负环,求最小值->常用二分答案. 二 ...

  2. UVA 11090 - Going in Cycle!!(Bellman-Ford)

    UVA 11090 - Going in Cycle!! option=com_onlinejudge&Itemid=8&page=show_problem&category= ...

  3. UVA 11090 - Going in Cycle!! SPFA

    http://uva.onlinejudge.org/index.php?option=com_onlinejudge&Itemid=8&page=show_problem&p ...

  4. UVa 11090 Going in Cycle!!【Bellman_Ford】

    题意:给出n个点m条边的加权有向图,求平均值最小的回路 自己想的是用DFS找环(真是too young),在比较找到各个环的平均权值,可是代码实现不了,觉得又不太对 后来看书= =好巧妙的办法, 使用 ...

  5. UVA 11090 Going in Cycle!!

    要求给定的图的中平均权值最小的环,注意处理自环的情况就能过了. 按照w1+w2+w3+….wn < n*ave的不等式,也就是(w1-ave) + (w2-ave) +…..(wn-ave) & ...

  6. UVA - 11090 - Going in Cycle!!(二分+差分约束系统)

    Problem  UVA - 11090 - Going in Cycle!! Time Limit: 3000 mSec Problem Description You are given a we ...

  7. The Minimum Cycle Mean in a Digraph 《有向图中的最小平均权值回路》 Karp

    文件链接 Karp在1977年的论文,讲述了一种\(O(nm)\)的算法,用来求有向强连通图中最小平均权值回路(具体问题请参照这里) 本人翻译(有删改): 首先任取一个节点 \(s\) ,定义 \(F ...

  8. UVa 11090 Going in Cycle!! (Bellman_Ford)

    题意:给定一个加权有向图,求平均权值最小的回路. 析:先十分答案,假设答案是 ans,那么有这么一个回路,w1+w2+w3+...+wk < k*ans,这样就是答案太大,然后移项可得,(w1- ...

  9. UVA 11090 Going in Cycle!!(Bellman-Ford推断负圈)

    题意:给定一个n个点m条边的加权有向图,求平均权值最小的回路. 思路:使用二分法求解.对于每个枚举值mid,推断每条边权值减去mid后有无负圈就可以. #include<cstdio> # ...

随机推荐

  1. 引擎设计跟踪(九.10) Max插件更新,地形问题备忘

    最近没有大的更新. 最近本来要做max的骨骼/动画导出, 看导出插件代码的时候, 突然想起之前tagent space导出的疑问, 于是确认了一下. http://www.cnblogs.com/cr ...

  2. win8 任务栏不合并隐藏标题

    让win8任务栏不合并,并且隐藏标题的办法: 效果如下: 首先让win8不合并任务栏 1.任务栏上点鼠标右键 -- "属性" 2."任务栏按钮"选择" ...

  3. Unity3D 游戏开发构架篇 ——角色类的设计与持久化

    在游戏开发中,游戏角色占了很大的篇幅,可以说游戏中所有的内容都是由主角所带动.这里就介绍一下角色类的设计和持久化. 一.角色类应用场景和设计思想 游戏中的角色类型不一而足,有不同的技能,有不同的属性等 ...

  4. 【设计模式六大原则4】接口隔离原则(Interface Segregation Principle)

      定义:客户端不应该依赖它不需要的接口:一个类对另一个类的依赖应该建立在最小的接口上. 问题由来:类A通过接口I依赖类B,类C通过接口I依赖类D,如果接口I对于类A和类B来说不是最小接口,则类B和类 ...

  5. poj 2253 Frogger (最短路变种,连通图的最长边)

    题目 这里的dijsktra的变种代码是我看着自己打的,终于把代码和做法思路联系上了,也就是理解了算法——看来手跟着画一遍真的有助于理解. #define _CRT_SECURE_NO_WARNING ...

  6. 如何正确学习JavaScript

    不要这样学习JavaScript 不要一开始就埋头在成堆的JavaScript在线教程里 ,这是最糟糕的学习方法.或许在看过无数个教程后会有点成效,但这样不分层次结构地学习一个东西实在是十分低效,在实 ...

  7. Project Euler 83:Path sum: four ways 路径和:4个方向

    Path sum: four ways NOTE: This problem is a significantly more challenging version of Problem 81. In ...

  8. [topcoder]HappyLetterDiv2

    http://community.topcoder.com/stat?c=problem_statement&pm=13245 就是有字符串,里面的字符可以随意两两消除,如果不等的话,那么最后 ...

  9. HttpServletRequestWrapper的使用

    老大给了一个很实际的需求:有段程序,使用Http的方式与合作商交互,而且是明文传输数据.我方的代码已经打包放在服务器上运行了很长时间,这时合作商突然要求修改数据传输的方式,要求加密后再传输,而我方的原 ...

  10. java nio管道

    管道(Pipe) (本部分原文链接,作者:Jakob Jenkov,译者:黄忠,校对:丁一) Java NIO 管道是2个线程之间的单向数据连接.Pipe有一个source通道和一个sink通道.数据 ...