[关闭]
@ysner 2018-05-12T09:55:03.000000Z 字数 1359 阅读 1492

[HNOI2009]最小圈

二分 负环


题面

给一有向图,询问圈的最小平均值。

解析

先二分圈的平均值的最小值,记当前答案为
这时候,把所有的边权都减掉
这样判断原图中是否包含有平均值小于等于的圈,就转化成了判断新图中是否包含有负环。用判断负环即可。
Update:但我这个程序过不了第二个样例。。。

  1. // luogu-judger-enable-o2
  2. #include<iostream>
  3. #include<cmath>
  4. #include<cstring>
  5. #include<cstdio>
  6. #include<cstdlib>
  7. #include<algorithm>
  8. #include<queue>
  9. #define ll long long
  10. #define re register
  11. #define il inline
  12. #define eps 1e-10
  13. #define fp(i,a,b) for(re int i=a;i<=b;i++)
  14. #define fq(i,a,b) for(re int i=a;i>=b;i--)
  15. using namespace std;
  16. const int N=5000;
  17. int n,m,h[N],cnt;double mid,dis[N];
  18. bool vis[N],viss;
  19. struct Edge{int to,next,w;}e[N<<1];
  20. il void add(re int u,re int v,re int w){e[++cnt]=(Edge){v,h[u],w};h[u]=cnt;}
  21. il int gi()
  22. {
  23. re int x=0,t=1;
  24. re char ch=getchar();
  25. while((ch<'0'||ch>'9')&&ch!='-') ch=getchar();
  26. if(ch=='-') t=-1,ch=getchar();
  27. while(ch>='0'&&ch<='9') x=x*10+ch-48,ch=getchar();
  28. return x*t;
  29. }
  30. il void wri(re int x)
  31. {
  32. if(x<0) putchar('-'),x=-x;
  33. if(x>9) wri(x/10);
  34. putchar(x%10+'0');
  35. }
  36. il void SPFA(re int u)
  37. {
  38. if(viss) return;
  39. vis[u]=1;
  40. for(re int i=h[u];i;i=e[i].next)
  41. {
  42. re int v=e[i].to;
  43. if(dis[v]>dis[u]+e[i].w-mid)
  44. {
  45. dis[v]=dis[u]+e[i].w-mid;
  46. if(vis[v]) {viss=1;return;}
  47. SPFA(v);
  48. }
  49. }
  50. vis[u]=0;
  51. }
  52. il int check()
  53. {
  54. memset(dis,0,sizeof(dis));memset(vis,0,sizeof(vis));viss=0;
  55. fp(i,1,n)
  56. {
  57. SPFA(i);
  58. if(viss) return 1;
  59. }
  60. return 0;
  61. }
  62. int main()
  63. {
  64. n=gi();m=gi();
  65. fp(i,1,m)
  66. {
  67. re int u=gi(),v=gi(),w=gi();
  68. add(u,v,w);
  69. }
  70. re double l=-1e33,r=1e33;
  71. while(l+eps<r)
  72. {
  73. mid=(l+r)/2;
  74. if(check()) r=mid;else l=mid;
  75. }
  76. printf("%.8lf\n",l);
  77. return 0;
  78. }
添加新批注
在作者公开此批注前,只有你和作者可见。
回复批注