bzoj 1834

灰太狼 2021-12-20 14:51 345阅读 0赞

网络流的模板题

首先第一问我们直接用dinic搞就行了,费用直接存为0(时间上界非常松,这道题是能过),然后第二问我们只需要在第一问

的残余网络上加一个源点,源点指向1号点,容量为k,费用为0,然后对于之前的每一条边,建一个相同的边

容量为无穷大,费用为原来的费用。

  1. //By BLADEVIL
  2. var
  3. pre, other, len, w :array[0..20100] of longint;
  4. last :array[0..2100] of longint;
  5. l :longint;
  6. n, m, k :longint;
  7. father, que, dis :array[0..2100] of longint;
  8. flag :array[0..2100] of boolean;
  9. a, b, c, d :array[0..20100] of longint;
  10. cost :longint;
  11. function min(a,b:longint):longint;
  12. begin
  13. if a>b then min:=b else min:=a;
  14. end;
  15. procedure connect(a,b,c,d:longint);
  16. begin
  17. inc(l);
  18. pre[l]:=last[a];
  19. last[a]:=l;
  20. other[l]:=b;
  21. len[l]:=c;
  22. w[l]:=d;
  23. end;
  24. procedure init;
  25. var
  26. i :longint;
  27. begin
  28. read(n,m,k);
  29. l:=1;
  30. for i:=1 to m do read(a[i],b[i],c[i],d[i]);
  31. for i:=1 to m do
  32. begin
  33. connect(a[i],b[i],c[i],0);
  34. connect(b[i],a[i],0,0);
  35. end;
  36. end;
  37. function bfs:boolean;
  38. var
  39. q, p :longint;
  40. cur :longint;
  41. h, t :longint;
  42. begin
  43. fillchar(dis,sizeof(dis),0);
  44. h:=0; t:=1;
  45. que[1]:=1; dis[1]:=1;
  46. while t<>h do
  47. begin
  48. inc(h);
  49. cur:=que[h];
  50. q:=last[cur];
  51. while q<>0 do
  52. begin
  53. p:=other[q];
  54. if (len[q]>0) and (dis[p]=0) then
  55. begin
  56. inc(t);
  57. que[t]:=p;
  58. dis[p]:=dis[cur]+1;
  59. if p=n then exit(true);
  60. end;
  61. q:=pre[q];
  62. end;
  63. end;
  64. exit(false);
  65. end;
  66. function dinic(x,flow:longint):longint;
  67. var
  68. q, p :longint;
  69. rest, tmp :longint;
  70. begin
  71. if x=n then exit(flow);
  72. rest:=flow;
  73. q:=last[x];
  74. while q<>0 do
  75. begin
  76. p:=other[q];
  77. if (len[q]>0) and (rest>0) and (dis[p]=dis[x]+1) then
  78. begin
  79. tmp:=dinic(p,min(len[q],rest));
  80. dec(rest,tmp);
  81. dec(len[q],tmp);
  82. inc(len[q xor 1],tmp);
  83. end;
  84. q:=pre[q];
  85. end;
  86. exit(flow-rest);
  87. end;
  88. procedure spfa;
  89. var
  90. q, p :longint;
  91. h, t, cur :longint;
  92. begin
  93. fillchar(flag,sizeof(flag),false);
  94. filldword(dis,sizeof(dis) div 4,maxlongint div 10);
  95. h:=0; t:=1;
  96. que[1]:=n+1;
  97. dis[n+1]:=0;
  98. while h<>t do
  99. begin
  100. h:=h mod 2000+1;
  101. cur:=que[h];
  102. flag[cur]:=false;
  103. q:=last[cur];
  104. while q<>0 do
  105. begin
  106. if len[q]>0 then
  107. begin
  108. p:=other[q];
  109. if dis[cur]+w[q]<dis[p] then
  110. begin
  111. dis[p]:=dis[cur]+w[q];
  112. father[p]:=q;
  113. if not flag[p] then
  114. begin
  115. t:=t mod 2000+1;
  116. que[t]:=p;
  117. flag[p]:=true;
  118. end;
  119. end;
  120. end;
  121. q:=pre[q];
  122. end;
  123. end;
  124. end;
  125. procedure update;
  126. var
  127. cur :longint;
  128. low :longint;
  129. begin
  130. cur:=n;
  131. low:=maxlongint div 10;
  132. while cur<>n+1 do
  133. begin
  134. low:=min(low,len[father[cur]]);
  135. cur:=other[father[cur] xor 1];
  136. end;
  137. cur:=n;
  138. while cur<>n+1 do
  139. begin
  140. inc(cost,low*w[father[cur]]);
  141. dec(len[father[cur]],low);
  142. inc(len[father[cur] xor 1],low);
  143. cur:=other[father[cur] xor 1];
  144. end;
  145. end;
  146. procedure main;
  147. var
  148. ans :longint;
  149. i :longint;
  150. begin
  151. ans:=0;
  152. while bfs do
  153. ans:=ans+dinic(1,maxlongint div 10);
  154. for i:=1 to m do
  155. begin
  156. connect(a[i],b[i],maxlongint div 10,d[i]);
  157. connect(b[i],a[i],0,-d[i]);
  158. end;
  159. connect(n+1,1,k,0);
  160. connect(1,n+1,0,0);
  161. while true do
  162. begin
  163. spfa;
  164. if dis[n]=maxlongint div 10 then break;
  165. update;
  166. end;
  167. writeln(ans,' ',cost);
  168. end;
  169. begin
  170. init;
  171. main;
  172. end.

转载于:https://www.cnblogs.com/BLADEVIL/p/3442589.html

发表评论

表情:
评论列表 (有 0 条评论,345人围观)

还没有评论,来说两句吧...

相关阅读

    相关 BZOJ2938

    BZOJ2938-病毒 题意: > 二进制病毒审查委员会最近发现了如下的规律:某些确定的二进制串是病毒的代码。如果某段代码中不存在任何一段病毒代码,那么我们...

    相关 bzoj3632

    裸的最大团,随机化大法好 多次随机出一个选择顺序然后贪心即可 ![ContractedBlock.gif][] ![ExpandedBlockStart.gif][]

    相关 bzoj4042

    比较好的树形dp,涉及到树上路径的题目,我们往往考虑对路径分类 当我们考虑以x为根的子树,有这样几类路径 1. 起点终点都在子树内 2. 一个点延伸到子树外 对于要选择

    相关 bzoj 1834

    网络流的模板题 首先第一问我们直接用dinic搞就行了,费用直接存为0(时间上界非常松,这道题是能过),然后第二问我们只需要在第一问 的残余网络上加一个源点,源点指向1号点

    相关 BZOJ2019】nim

    著名游戏设计师vfleaking,最近迷上了Nim。普通的Nim游戏为:两个人进行游戏,N堆石子,每回合可以取其中某一堆的任意多个,可以取完,但不可以不取。谁不能取谁输。...

    相关 bzoj4407

    以前写过一次线性筛 发现不是很理解 写了个欧拉筛的 t了 其实每次推式子,都会先推出一组的