1834: [ZJOI2010]network 网络扩容

Time Limit: 3 Sec  Memory Limit: 64 MB Submit: 3330  Solved: 1739 [Submit][Status][Discuss]

Description

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

Input

输入文件的第一行包含三个整数N,M,K,表示有向图的点数、边数以及所需要增加的流量。 接下来的M行每行包含四个整数u,v,C,W,表示一条从u到v,容量为C,扩容费用为W的边。

Output

输出文件一行包含两个整数,分别表示问题1和问题2的答案。

Sample Input

5 8 2
1 2 5 8
2 5 9 9
5 1 6 2
5 1 1 8
1 2 8 7
2 5 4 9
1 2 1 1
1 4 2 1

Sample Output

13 19
30%的数据中,N<=100
100%的数据中,N<=1000,M<=5000,K<=10
对于第一问,我们直接跑网络流。
对于第二问,我们先建一个超级源,从这个超级源向1连一条容量为k,费用为0的边。
之后对于原图的每一条边,建一条容量无限的边,跑最小费用最大流即可。

  1 #include<iostream>
  2 #include<cstring>
  3 #include<cstdio>
  4 #include<cstdlib>
  5 #include<cmath>
  6 #include<algorithm>
  7 #define maxm 5005
  8 #define maxn 1005
  9 using namespace std;
 10 struct data {
 11     int from,to,next,w,c;
 12 }e[maxm*4];
 13 int head[maxn],cnt;
 14 void add(int u,int v,int w,int c){e[cnt].from=u;e[cnt].next=head[u];e[cnt].to=v;e[cnt].w=w;e[cnt].c=c;head[u]=cnt++;}
 15 int n,m,k;
 16 int q[maxn];
 17 bool vis[maxn];
 18 int dis[maxn];
 19 bool bfs() {
 20     memset(dis,-1,sizeof(dis));
 21     int h=0,t=1;
 22     q[h]=1;
 23     vis[1]=1;
 24     dis[1]=0;
 25     while(h!=t) {
 26         int now=q[h];h++;vis[now]=0;if(h==1000) h=0;
 27         for(int i=head[now];i>=0;i=e[i].next) {
 28             int to=e[i].to;
 29             if(e[i].w&&dis[to]<0) {
 30                 dis[to]=dis[now]+1;
 31                 if(!vis[to]){
 32                     vis[to]=1;
 33                     q[t++]=to;if(t==1000)t=0;
 34                 }
 35             }
 36         }
 37     }
 38     return dis[n]!=-1;
 39 }
 40 int dfs(int now,int a) {
 41     if(now==n||a==0) return a;
 42     int flow=0,f;
 43     for(int i=head[now];i>=0;i=e[i].next) {
 44         int to=e[i].to;
 45         if(dis[to]==dis[now]+1&&e[i].w>0) {
 46             f=dfs(to,min(a,e[i].w));
 47             e[i].w-=f;
 48             e[i^1].w+=f;
 49             flow+=f;
 50             a-=f;
 51             if(a==0) return flow;
 52         }
 53     }
 54     if(!flow) dis[now]=-1;
 55     return flow;
 56 }
 57 void work1() {
 58     int ans=0;
 59     while(bfs()){ans+=dfs(1,2147483647);}
 60     printf("%d ",ans);
 61 }
 62 int cost=0;
 63 bool spfa() {
 64     for(int i=0;i<=n;i++) dis[i]=-1000000000;
 65     int h=0,t=1;
 66     q[h]=n;
 67     vis[n]=1;
 68     dis[n]=0;
 69     while(h!=t) {
 70         int now=q[h];h++;vis[now]=0;if(h==1000) h=0;
 71         for(int i=head[now];i>=0;i=e[i].next) {
 72             int to=e[i].to;
 73             if(e[i^1].w&&dis[to]<dis[now]+e[i].c) {
 74                 dis[to]=dis[now]+e[i].c;
 75                 if(!vis[to]){
 76                     vis[to]=1;
 77                     q[t++]=to;if(t==1000)t=0;
 78                 }
 79             }
 80         }
 81     }
 82     cost-=dis[0];
 83     return dis[0]!=-1000000000;
 84 }
 85 int ans2;
 86 int zkw(int now,int a) {
 87     if(now==n||a==0){ans2+=cost*a;return a;}
 88     int flow=0,f;vis[now]=1;
 89     for(int i=head[now];i>=0;i=e[i].next) {
 90         int to=e[i].to;
 91         if(dis[to]==dis[now]+e[i].c&&e[i].w>0&&!vis[to]&&(f=zkw(to,min(a,e[i].w)))) {
 92             e[i].w-=f;
 93             e[i^1].w+=f;
 94             flow+=f;
 95             a-=f;
 96             if(a==0) break;
 97         }
 98     }
 99     return flow;
100 }
101 void build() {
102     int t=cnt;
103     for(int i=0;i<t;i+=2) {
104         add(e[i].from,e[i].to,1147483647,e[i].c);
105          add(e[i].to,e[i].from,0,-e[i].c);
106     }
107     add(0,1,k,0);
108     add(1,0,0,0);
109     for(int i=0;i<t;i++) e[i].c=0;
110 }
111 void work2() {
112     ans2=0;cost=0;
113     build();
114     memset(vis,0,sizeof(vis));
115     while(spfa()) {
116         do {
117             memset(vis,0,sizeof(vis));
118         }while(zkw(0,2147483647));
119         memset(vis,0,sizeof(vis));cost=0;
120     }
121     printf("%d",ans2);
122 }
123 int main() {
124     memset(head,-1,sizeof(head));
125     scanf("%d%d%d",&n,&m,&k);
126     for(int i=1;i<=m;i++) {
127         int u,v,w,c;
128         scanf("%d%d%d%d",&u,&v,&w,&c);
129         add(u,v,w,c);add(v,u,0,-c);
130     }
131     work1();
132     work2();
133 }

View Code

转载于:https://www.cnblogs.com/wls001/p/7678966.html

[BZOJ1834][ZJOI2010]network 网络扩容 最大流+费用流相关推荐

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

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

  2. BZOJ1834 [ZJOI2010]network 网络扩容

    网络流训练好题...但是要给差评!蒟蒻表示这就是板子题,然后做了半个小时T T 先跑一边最大流,得到第一问答案ans. 第二问:原先的边不动,费用为0. 然后对每条边在上面再加一条边,流量为inf,费 ...

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

    题目描述 传送门 题解 Q1 傻逼最大流 Q2 求出最大流之后将图暴力重构,原图中的边费用为0,流量为初始流量,添加一些和原图边同始同终的边,费用为扩容费用,流量为INF,再添加一个超级源连向原先的源 ...

  4. [bzoj1834][ZJOI2010]network 网络扩容

    来自FallDream的博客,未经允许,请勿转载,谢谢. 给定一张有向图,每条边都有一个容量C和一个扩容费用W.这里扩容费用是指将容量扩大1所需的费用.求: 1. 在不扩容的情况下,1到N的最大流: ...

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

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

  6. [BZOJ 1834] [ZJOI2010]network 网络扩容

    1834: [ZJOI2010]network 网络扩容 Time Limit: 3 SecMemory Limit: 64 MB Description 给定一张有向图,每条边都有一个容量C和一个扩 ...

  7. 【BZOJ】1834: [ZJOI2010]network 网络扩容(最大流+费用流)

    http://www.lydsy.com/JudgeOnline/problem.php?id=1834 我又思考人生了T_T,nd的数组开小了,一直wa,调了一个小时才发现啊!!!!!我一直以为我的 ...

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

    第一问直接跑最大流即可.建图的时候按照费用流建,费用为0. 对于第二问,在第一问dinic剩下的残量网络上建图,对原图的每条边(i,j),建(i,j,inf,cij),表示可以用c的花费增广这条路.然 ...

  9. 【BZOJ1834】【codevs1362】网络扩容,最大流+费用流

    传送门1 传送门2 写在前面:打BC被虐的好爽 思路: 第一问跑最大流即可 第二问添加带费用的边,流量为inf,继续残余网络费用流就行了,为了控制流量,让n向新的源点连一条流量为k,费用为0的边 注意 ...

最新文章

  1. Android官方命令深入分析之Device Monitor
  2. JAVA中一维数组的作用,JAVA中一维数组和二维数组的定义
  3. 为什么说C语言是面向过程的?
  4. 广州交警发布科目三电子路考操作要点
  5. oracle sql语句 exists
  6. 【python】详解类class的继承、__init__初始化、super方法
  7. 使用labelme进行图片语义分割数据的标注(如何转换为训练的灰度图,即像素值为类别值)
  8. 【工具】动软代码生成器连接数据库
  9. SCM供应链管理系统介绍:企业SCM供应链系统应用领域、优势、功能详解
  10. python使用ttf文件_python – 如何在matplotlib中使用(随机)* .otf或* .ttf字体?
  11. 判断粗大误差的matlab程序,粗大误差处理程序
  12. AD 常见绿色报错的消除
  13. flask—本地图片,视频上传
  14. O‘REILLY: Reverse Every Ascending —— 将列表中的升序改为降序
  15. [区块链]区块链技术在殡葬行业的思考
  16. 混凝土墙开洞_请教各位大神,混凝土墙体开洞通常有几种方法
  17. lsr: Cannot access .: No such file or directory. 解决办法
  18. Storm-电商实时交易风控系统
  19. 【河北OI 2012 DAY1】采花 线段树
  20. 一步一步学习Glade

热门文章

  1. 系统辨识理论及应用_控制理论学习书单推荐(值得一读)
  2. 重庆电子工程学院计算机专业,重庆计算机电子工程职业学院2020年招生录取分数线...
  3. cadence自动生成铺铜_干货 | 国内铜湿法冶金工艺现状分析
  4. a标签跳转后返回原页面 layui_layui页面操作,点击一个添加页面,跳转有确定,然后点击确定后将选择的几个数据返回前一个页面获取值,然后ajax请求后台...
  5. arcgis制作空间变化图怎么做_听说如果做数据分析不用GIS,会被开?
  6. asr语音转写_搜狗智能录音笔C1正式上市 语音转文字准确率达95%
  7. 计算机屏幕亮度调到多少合适,电脑屏幕的亮度和对比度调到多少比较合适,对眼睛伤害最小?有哪位高手了解?...
  8. ajax离开页面方法,如果用户在页面加载完成之前离开页面,则触发jQuery ajaxError()处理程序...
  9. Python: ufunc ‘bitwise_xor‘ not supported for the input types,....
  10. activity 变成后台进程后被杀死_Android 后台运行白名单,优雅实现保活