zoj 2314 Reactor Cooling--无源汇有上下界最大流--递归sap

前端之家收集整理的这篇文章主要介绍了zoj 2314 Reactor Cooling--无源汇有上下界最大流--递归sap前端之家小编觉得挺不错的,现在分享给大家,也给大家做个参考。
  1. /*
  2. 我也没有读题 刚学就直接搜的这类题 找了个简单的练习
  3. 大致上好像是这么个意思 给你一个图 边有上下界
  4. 求无源汇最大流 没有输出NO 有则输出 YES 并输出 各边的流量
  5. */
  6. #include<iostream>
  7. #include<string.h>
  8. using namespace std;
  9. const int N=205;
  10. struct node
  11. {
  12. int u,v;
  13. }e[N*N];
  14. int l[N][N],u[N][N],g[N][N],d[N],num[N],n,m,sink,src;
  15. int min(int a,int b){return a<b?a:b;}
  16. int sap(int u,int f)
  17. {
  18. if(u==sink)
  19. return f;
  20. int v,mind=n+1,last=f,cost;
  21. for(v=0;v<=n+1;++v)
  22. {
  23. if(g[u][v]>0)//有流量
  24. {
  25. if(d[u]==d[v]+1)//有允许边
  26. {
  27. cost=sap(v,min(last,g[u][v]));
  28. g[u][v]-=cost;//修改
  29. g[v][u]+=cost;
  30. last-=cost;//修改剩余流量
  31. if(d[src]>=n+2)//结束标志
  32. return f-last;
  33. if(last==0)//使用完就退出
  34. break;
  35. }
  36. if(d[v]<mind)//下面更新距离的时候用 求其能连接到的最小距离 这个判断和上边的那个判断并列 因为他们是互斥的,只有当找不到允许边的时候才用得着mind
  37. mind=d[v];
  38. }
  39. }
  40. if(last==f)//流量没有使用 即 没有允许边
  41. {
  42. --num[d[u]];
  43. if(num[d[u]]==0)//若出现断层
  44. {
  45. d[src]=n+2;
  46. }
  47. d[u]=mind+1;
  48. ++num[d[u]];
  49. }
  50. return f-last;
  51. }
  52. int main()
  53. {
  54. int t,i,j,a,b,c,h;
  55. cin>>t;
  56. while(t--)
  57. {
  58. memset(g,sizeof(g));
  59. memset(l,sizeof(l));//曾经忘了初始化这俩 老是错
  60. memset(u,sizeof(u));//
  61. cin>>n>>m;
  62. sink=n+1;
  63. src=0;
  64. for(i=1;i<=m;++i)
  65. {
  66. cin>>a>>b>>c>>h;
  67. e[i].u=a;//记录边 以便 存在答案是输出
  68. e[i].v=b;
  69. l[a][b]=c;
  70. u[a][b]=h;
  71. }
  72. b=0;
  73. for(i=1;i<=n;++i)
  74. {
  75. a=0;
  76. for(j=1;j<=n;++j)
  77. {
  78. a+=l[j][i]-l[i][j];//统计 输入流比输出流多多少
  79. g[i][j]=u[i][j]-l[i][j];
  80. }
  81. if(a>0)
  82. b+=g[0][i]=a;
  83. else g[i][n+1]=-a;
  84. }
  85. c=0;
  86. memset(d,sizeof(d));
  87. memset(num,sizeof(num));
  88. for(num[0]=n+2;d[0]<n+2;)
  89. c+=sap(0,0x7fffffff);
  90. if(c<b)
  91. cout<<"NO"<<endl;
  92. else
  93. {
  94. cout<<"YES"<<endl;
  95. for(i=1;i<=m;++i)
  96. cout<<(u[e[i].u][e[i].v]-g[e[i].u][e[i].v])<<endl;
  97. }
  98. }
  99. return 0;
  100. }

猜你在找的React相关文章