第一问跑最大流,第二问新建一条边连接0和1,流量为上第一问的答案+k,费用为0,接下来图中每条边拆成两条边,第一条容量为C费用为0,第二条容量无穷费用为W,再跑一遍费用流即可。

  代码

  1. #include<cstdio>
  2. #include<algorithm>
  3. #include<cstring>
  4. #include<iostream>
  5. #include<set>
  6. #include<queue>
  7. #define mp make_pair
  8. #define inf 0x37373737
  9. #define N 30050
  10. #define M 30050
  11. using namespace std;
  12. struct Dinic {
  13. int s, t, n, pre[N], cur[N], h[N], level[N], sign, q[N];
  14. int cap[M], to[M], ne[M], flow, e;
  15. void liu(int u, int v, int w) {
  16. to[e] = v, ne[e] = h[u], cap[e] = w;
  17. h[u] = e++;
  18. }
  19. void link(int u, int v, int w) {
  20. liu(u, v, w);
  21. liu(v, u, );
  22. }
  23. void init(int n) {
  24. for (int i = ; i <= n; ++i)
  25. h[i] = -;
  26. e = ;
  27. }
  28. bool bfs() {
  29. int L = , R = ;
  30. fill(level, level + n, -);
  31. sign = q[R++] = t;
  32. level[t] = ;
  33. while (L < R && level[s] == -) {
  34. int c = q[L++];
  35. for (int k = h[c]; ~k; k = ne[k]) {
  36. if (cap[k ^ ] > && level[to[k]] == -)
  37. level[to[k]] = level[c] + , q[R++] = to[k];
  38. }
  39. }
  40. return ~level[s];
  41. }
  42. void push() {
  43. int pl = inf, p, k;
  44. for (p = t; p != s; p = to[k ^ ]) {
  45. k = pre[p];
  46. pl = min(pl, cap[k]);
  47. }
  48. for (p = t; p != s; p = to[k ^ ]) {
  49. k = pre[p];
  50. cap[k] -= pl;
  51. cap[k ^ ] += pl;
  52. if (cap[k] == )
  53. sign = to[k ^ ];
  54. }
  55. flow += pl;
  56. }
  57. void dfs(int c) {
  58. if (c == t)
  59. push();
  60. else {
  61. for (int &k = cur[c]; ~k; k = ne[k])
  62. if (cap[k] > && level[to[k]] + == level[c]) {
  63. pre[to[k]] = k;
  64. dfs(to[k]);
  65. if (level[sign] > level[c])
  66. return;
  67. sign = t;
  68. }
  69. level[c] = -;
  70. }
  71. }
  72. int run(int _s, int _t, int _n) {
  73. s = _s, t = _t, n = _n;
  74. flow = ;
  75. while (bfs()) {
  76. for (int i = ; i < n; ++i)
  77. cur[i] = h[i];
  78. dfs(s);
  79. }
  80. return flow;
  81. }
  82. } mf;
  83.  
  84. struct MCMF{
  85. int h[N] , dis[N] , ing[N] , pre[N] , s , t , n;
  86. int to[M] , ne[M] , cap[M] , cost[M] , e;
  87. void ini(){
  88. fill(h,h+N,-);
  89. e = ;
  90. }
  91. void liu(int u,int v,int c,int w){
  92. to[e] = v , ne[e] = h[u] , cap[e] = c , cost[e] = w;
  93. h[u] = e++;
  94. }
  95. void link(int u,int v,int c,int w){
  96. liu(u,v,c,w);
  97. liu(v,u,,-w);
  98. }
  99. bool spfa(){
  100. queue<int> Q;
  101. fill(ing,ing+n,);
  102. fill(pre,pre+n,-);
  103. fill(dis,dis+n,inf);
  104. ing[s] = true , dis[s] = ;
  105. Q.push(s);
  106. while(!Q.empty()){
  107. int c = Q.front();Q.pop();ing[c] = false;
  108. for(int k=h[c];~k;k=ne[k]){
  109. int v = to[k];
  110. if(cap[k] <= ) continue;
  111. if(dis[c] + cost[k] < dis[v]){
  112. dis[v] = dis[c] + cost[k];
  113. pre[v] = k;
  114. if(!ing[v]) Q.push(v) , ing[v] = true;
  115. }
  116. }
  117. }
  118. return dis[t] != inf;
  119. }
  120. int flow , mincost;
  121. pair<int,int> run(int _s,int _t,int _n){
  122. s = _s , t = _t , n = _n;
  123. flow = mincost = ;
  124. while(spfa()){
  125. int pl = inf , p , k;
  126. for(p=t;p!=s;p=to[k^]){
  127. k = pre[p];
  128. pl = min(pl,cap[k]);
  129. }
  130. for(p=t;p!=s;p=to[k^]){
  131. k = pre[p];
  132. cap[k] -= pl;
  133. cap[k^] += pl;
  134. }
  135. mincost += pl * dis[t];
  136. flow += pl;
  137. }
  138. return mp(flow,mincost);
  139. }
  140. };
  141. MCMF mcmf;
  142.  
  143. int n,m,k,i,a,b,c,d,flow,cost;
  144. int main()
  145. {
  146. scanf("%d%d%d",&n,&m,&k);
  147. mf.init(n+);
  148. mcmf.ini();
  149. for (i=;i<=m;i++)
  150. {
  151. scanf("%d%d%d%d",&a,&b,&c,&d);
  152. mf.link(a,b,c);
  153. mcmf.link(a,b,c,);
  154. mcmf.link(a,b,,d);
  155. }
  156. flow=mf.run(,n,n+);
  157. mcmf.link(,,flow+k,);
  158. printf("%d %d",flow,mcmf.run(,n,n+).second);
  159. }

bzoj1834 [ZJOI2010]network 网络扩容的更多相关文章

  1. BZOJ1834 [ZJOI2010]network 网络扩容 【最大流,费用流】

    1834: [ZJOI2010]network 网络扩容 Time Limit: 3 Sec  Memory Limit: 64 MB Submit: 3394  Solved: 1774 [Subm ...

  2. [BZOJ1834][ZJOI2010]network 网络扩容 最大流+费用流

    1834: [ZJOI2010]network 网络扩容 Time Limit: 3 Sec  Memory Limit: 64 MB Submit: 3330  Solved: 1739 [Subm ...

  3. bzoj1834: [ZJOI2010]network 网络扩容 费用流

    bzoj1834 给定一张有向图,每条边都有一个容量C和一个扩容费用W.这里扩容费用是指将容量扩大1所需的费用. 求: 1.在不扩容的情况下,1到N的最大流: 2.将1到N的最大流增加K所需的最小扩容 ...

  4. 【费用流】bzoj1834: [ZJOI2010]network 网络扩容

    还是稍微记一下这个拆点模型吧 Description 给定一张有向图,每条边都有一个容量C和一个扩容费用W.这里扩容费用是指将容量扩大1所需的费用. 求:  1.在不扩容的情况下,1到N的最大流:  ...

  5. 2018.10.13 bzoj1834: [ZJOI2010]network 网络扩容(最大流+费用流)

    传送门 网络流水题啊. 第一问直接放心跑最大流(本来还以为有什么tricktricktrick). 第二问就直接把原来的边(u,v,c,w)(u,v,c,w)(u,v,c,w)变成(u,v,c,0)( ...

  6. 【最大流】【费用流】bzoj1834 [ZJOI2010]network 网络扩容

    引用题解: 最大流+费用流. 第一问最大流即可. 第二问为“最小费用最大流”. 由题意,这一问的可转化为在上一问的“残量网络”上,扩大一些边的容量,使能从新的图中的最大流为k. 那么易得:对于还有剩余 ...

  7. BZOJ1834 [ZJOI2010]network 网络扩容(最小费用最大流)

    挺直白的构图..最小费用最大流的定义. #include<cstdio> #include<cstring> #include<queue> #include< ...

  8. 【BZOJ1834】[ZJOI2010]network 网络扩容 最大流+最小费用流

    [BZOJ1834][ZJOI2010]network 网络扩容 Description 给定一张有向图,每条边都有一个容量C和一个扩容费用W.这里扩容费用是指将容量扩大1所需的费用.求: 1. 在不 ...

  9. bzoj1834: [ZJOI2010]network 网络扩容

    努力看了很久样例一直过不了...然后各种输出中间过程啊巴拉巴拉弄了1h,没办法了...然后突然想到啊原来的边可以用啊为什么不用...于是A了...感人肺腑 #include<cstdio> ...

随机推荐

  1. Cookie操作

    1.写cookie方法 #region 登录时写入cookie public static void LoginCookieSave(string uid, string loginname, str ...

  2. AppleScript

    一.资源 1.书本 2.ide: AppleSreipt Editor 3.界面辅助软件: UIBrowser 破解方法: a) ui browser -> show package conte ...

  3. Qt调用dll中的功能函数

    声明: 事先我已经自己动手写了一个简单的dll文件(myDLL.dll),C版接口的.并且用我前两篇有关DLL文章里面的方法,从dll中导出了导入库(.lib)文件,dll中有两个函数,原型如下:   ...

  4. 让Qt的无边框窗口支持拖拽、Aero Snap、窗口阴影等特性

    环境:Desktop Qt 5.4.1 MSVC2013 32bit 需要的库:dwmapi.lib .user32.lib 需要头文件:<dwmapi.h> .<windowsx. ...

  5. 转NodeJS的npm模块版本号 模式解析

    npm 中的模块版本都需要遵循 semver 2.0 的语义化版本规则. 版本格式:主版本号.次版本号.修订号,版本号递增规则如下: 主版本号:当你做了不兼容的API 修改, 次版本号:当你做了向下兼 ...

  6. An Implementation of Double-Array Trie

    Contents What is Trie? What Does It Take to Implement a Trie? Tripple-Array Trie Double-Array Trie S ...

  7. LightOj1190 - Sleepwalking(判断点与多边形的位置关系--射线法模板)

    题目链接:http://lightoj.com/volume_showproblem.php?problem=1190 题意:给你一个多边形含有n个点:然后又m个查询,每次判断点(x, y)是否在多边 ...

  8. IntelliJ IDEA gradle 创建 Java web 应用

    1.如下图,第一步很简单的,File->New->Project 2.在左边栏目找到Gradle,然后在右边勾选Java 和web 两个选项,next.如果只是Java项目就只选java就 ...

  9. POJ 1041问题描述

    Description Little Johnny has got a new car. He decided to drive around the town to visit his friend ...

  10. 浅析 Linux 初始化 init 系统,第 1 部分: sysvinit 第 2 部分: UpStart 第 3 部分: Systemd

    浅析 Linux 初始化 init 系统,第 1 部分: sysvinit  第 2 部分: UpStart 第 3 部分: Systemd http://www.ibm.com/developerw ...