zoj 2314 Reactor Cooling (有上下界的网络流)

前端之家收集整理的这篇文章主要介绍了zoj 2314 Reactor Cooling (有上下界的网络流)前端之家小编觉得挺不错的,现在分享给大家,也给大家做个参考。

算法:

新建一个源点汇点 st,en,对原来的每个点i,设m(i)=流入i点的流量下限fin-流出i点的流量下限fout,若m(i)>0,连一条<s,i>容量为m(i)的边;若m(i)<0,连一条<i,t>容量为-m(i)的边。然后将原来边的容量变为c<i,j>-b<i,j>,b<i,j>为流量下届。求一次最大流。如果与s和t关联的边全部满流,则可行流存在,且每条边的流量为现在的流量+流量的下界。否则不存在可行流。


我写了一早上,用我的Dinic模板第一次过不了网络流的题(o(╯□╰)o其实我也只做过几道网络流的题啦)

Dinic算法超时,加输入优化还是TLE!

然后改EK算法,加输入优化还是TLE!无奈之下去掉输入优化试一发,诶。。。A了。。。。

纪念一下第一道有上下界的网络流!


  1. #include<cstdio>
  2. #include<iostream>
  3. #include<cstring>
  4. #include<algorithm>
  5. #include<queue>
  6. #define maxn 210
  7. #define maxm 40010
  8. #define INF 0x3f3f3f3f
  9.  
  10. using namespace std;
  11.  
  12. struct node
  13. {
  14. int to,v,next;
  15. }e[maxm<<2];
  16. int head[maxn],cnt,maxflow[maxn],flow[maxn][maxn],fin[maxn],fout[maxn];
  17. int st,en,n,full,m,fa[maxn],l[maxm],a[maxm],b[maxm];
  18.  
  19. void add(int x,int y,int z)
  20. {
  21. e[cnt].to = y;
  22. e[cnt].v = z;
  23. e[cnt].next = head[x];
  24. head[x] = cnt++;
  25. e[cnt].to = x;
  26. e[cnt].v = 0;
  27. e[cnt].next = head[y];
  28. head[y] = cnt++;
  29. }
  30. void init()
  31. {
  32. memset(head,-1,sizeof(head));
  33. cnt = 0;
  34. st = 0;
  35. en = n+1;
  36. memset(fin,sizeof(fin));
  37. memset(fout,sizeof(fout));
  38. full = 0;
  39. }
  40. int EK()
  41. {
  42. int mf = 0;
  43. memset(flow,sizeof(flow));
  44. while(1)
  45. {
  46. queue<int> q;
  47. memset(maxflow,sizeof(maxflow));
  48. maxflow[st] = INF;
  49. q.push(st);
  50. while(!q.empty())
  51. {
  52. int u = q.front();
  53. q.pop();
  54. for(int i=head[u];i!=-1;i=e[i].next)
  55. {
  56. int v = e[i].to;
  57. if(!maxflow[v] && e[i].v>flow[u][v])
  58. {
  59. fa[v] = u;
  60. maxflow[v] = min(maxflow[u],e[i].v-flow[u][v]);
  61. q.push(v);
  62. }
  63. }
  64. }
  65. if(maxflow[en]==0)
  66. break;
  67. for(int i=en;i!=st;i=fa[i])
  68. {
  69. flow[fa[i]][i]+=maxflow[en];
  70. flow[i][fa[i]]-=maxflow[en];
  71. }
  72. mf+=maxflow[en];
  73. }
  74. return mf;
  75. }
  76.  
  77. void solve()
  78. {
  79. int mf = EK();
  80. if(mf!=full)
  81. printf("NO\n");
  82. else
  83. {
  84. printf("YES\n");
  85. for(int i=0;i<m;i++)
  86. printf("%d\n",flow[a[i]][b[i]]+l[i]);
  87. }
  88. }
  89. int main()
  90. {
  91. int T,c;
  92. char d;
  93. scanf("%d",&T);
  94. while(T--)
  95. {
  96. scanf("%d%d",&n,&m);
  97. init();
  98. for(int i=0;i<m;i++)
  99. {
  100. scanf("%d%d%d%d",&a[i],&b[i],&l[i],&c);
  101. add(a[i],b[i],c-l[i]);
  102. fin[b[i]]+=l[i];
  103. fout[a[i]]+=l[i];
  104. }
  105. for(int i=1;i<=n;i++)
  106. {
  107. int tmp = fin[i]-fout[i];
  108. if(tmp>0)
  109. {
  110. add(st,i,tmp);
  111. full += tmp;
  112. }
  113. else
  114. add(i,-tmp);
  115. }
  116. solve();
  117. }
  118. return 0;
  119. }

猜你在找的React相关文章