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的答案。

HINT

30%的数据中,N<=100

100%的数据中,N<=1000,M<=5000,K<=10
 
  网络流与费用流二合一233~
  首先第一问显然没有什么好讲的,直接跑一遍最大流即可。
  接下来是第二问。既然$k$这么小,那么我们保留下跑最大流后的残量网络,显然残量网络中有流量的边都是有可以直接流的,并且不需要任何费用。
  然后我们对于原图中的每一条边,新建一条容量为$inf$,费用为扩容费用 的边。接下来新建一个源点,向$1$号点连一条容量为$k$,费用为$0$的边,控制一下流量。
  最后跑一遍最小费用最大流即可。
  下面贴代码:
#include<iostream>
#include<cstdio>
#include<cstring>
#include<algorithm>
#include<cmath>
#define File(s) freopen(s".in","r",stdin),freopen(s".out","w",stdout)
#define maxn 1010
#define maxm 20010
#define INF (1<<25) using namespace std;
typedef long long llg; struct data{
int u,v,c,w;
}s[maxm];
int n,m,K,d[maxn],dep[maxn],ans,S,fa[maxn];
int head[maxn],next[maxm],to[maxm],c[maxm],f[maxm],tt=1;
bool w[maxn]; int getint(){
int w=0;bool q=0;
char c=getchar();
while((c>'9'||c<'0')&&c!='-') c=getchar();
if(c=='-') c=getchar(),q=1;
while(c>='0'&&c<='9') w=w*10+c-'0',c=getchar();
return q?-w:w;
} bool bfs(){
int l=0,r=0;
for(int i=1;i<=n;i++) dep[i]=-1;
dep[1]=1; d[r++]=1;
while(l!=r){
int u=d[l++];
for(int i=head[u],v;v=to[i],i;i=next[i])
if(c[i] && dep[v]==-1) dep[v]=dep[u]+1,d[r++]=v;
}
return dep[n]!=-1;
} int dfs(int u,int now){
if(u==n) return now;
if(!now) return 0;
int low=0;
for(int i=head[u],v,res;v=to[i],i;i=next[i])
if(c[i] && dep[v]==dep[u]+1){
res=dfs(v,min(now,c[i])); low+=res;
c[i]-=res; c[i^1]+=res; now-=res;
}
if(!low) dep[u]=-1;
return low;
} bool spfa(){
int l=0,r=0;
for(int i=1;i<=n;i++) dep[i]=-1,w[i]=0;
dep[S]=0; d[r++]=S; w[S]=1;
while(l!=r){
int u=d[l++]; w[u]=0; if(l==maxn) l=0;
for(int i=head[u],v;v=to[i],i;i=next[i])
if(c[i] && (dep[v]==-1 || dep[v]>dep[u]+f[i])){
dep[v]=dep[u]+f[i]; fa[v]=i;
if(!w[v]){
d[r++]=v; w[v]=1;
if(r==maxn) r=0;
}
}
}
return dep[n]!=-1;
} int get(){
int now=INF,ans=0;
for(int u=n;u!=S;u=to[fa[u]^1]) now=min(now,c[fa[u]]),ans+=f[fa[u]];
for(int u=n;u!=S;u=to[fa[u]^1]) c[fa[u]]-=now,c[fa[u]^1]+=now;
return now*ans;
} int main(){
File("a");
n=getint(); m=getint(); K=getint();
for(int i=1,u,v;i<=m;i++){
s[i].u=getint(),s[i].v=getint();
s[i].c=getint(),s[i].w=getint();
u=s[i].u; v=s[i].v;
to[++tt]=v;next[tt]=head[u];head[u]=tt;
to[++tt]=u;next[tt]=head[v];head[v]=tt;
c[tt-1]=s[i].c;
}
while(bfs()) ans+=dfs(1,INF);
printf("%d",ans);
for(int i=1,u,v;i<=m;i++){
u=s[i].u,v=s[i].v;
to[++tt]=v;next[tt]=head[u];head[u]=tt;
to[++tt]=u;next[tt]=head[v];head[v]=tt;
c[tt-1]=INF; f[tt-1]=s[i].w; f[tt]=-s[i].w;
}
S=n+1; ans=0;
to[++tt]=1;next[tt]=head[S];head[S]=tt; c[tt]=K;
to[++tt]=S;next[tt]=head[1];head[1]=tt;
while(spfa()) ans+=get();
printf(" %d",ans);
return 0;
}

BZOJ 1834 【ZJOI2010】 network 网络扩容的更多相关文章

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

    第一问直接跑最大流.然后将所有边再加一次,费用为扩容费用,容量为k,再从一个超级源点连一条容量为k,费用为0的边到原源点,从原汇点连一条同样的边到超级汇点,然  后跑最小费用最大流就OK了. ---- ...

  2. bzoj 1834: [ZJOI2010]network 网络扩容 -- 最大流+费用流

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

  3. bzoj 1834 [ZJOI2010]network 网络扩容(MCMF)

    [题目链接] http://www.lydsy.com/JudgeOnline/problem.php?id=1834 [题意] 给定一个有向图,每条边有容量C,扩容费用W,问最大流和使容量增加K的最 ...

  4. BZOJ 1834 [ZJOI2010]network 网络扩容(费用流)

    [题目链接] http://www.lydsy.com/JudgeOnline/problem.php?id=1834 [题目大意] 给定一张有向图,每条边都有一个容量C和一个扩容费用W. 这里扩容费 ...

  5. bzoj 1834: [ZJOI2010]network 网络扩容

    #include<cstdio> #include<iostream> #include<cstring> #define M 100000 #define inf ...

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

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

  7. BZOJ 1834: [ZJOI2010]network 网络扩容 最小费用流_最大流_残量网络

    对于第一问,跑一遍最大流即可. 对于第二问,在残量网络上的两点间建立边 <u,v>,容量为无限大,费用为扩充费用. 跑一遍最小费用流即可. Code: #include <vecto ...

  8. BZOJ 1834: [ZJOI2010]network 网络扩容(网络流+费用流)

    一看就知道是模板题= = ,不说什么了= = PS:回去搞期末了,暑假再来刷题了 CODE: #include<cstdio> #include<iostream> #incl ...

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

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

  10. 【BZOJ】1834 [ZJOI2010]network 网络扩容

    [算法]网络流-最大流+最小费用最大流(费用流) [题解] 第一问跑最大流. 第二问: 原始边相当于费用为0的边,再原图(跑过最大流的图)基础上添加带费用的边,容量为k(相当于inf). 第一问最大流 ...

随机推荐

  1. GET和POST请求

    GET与POST请求 简介 GET请求解释及语法格式 POST请求简介及语法 GET请求代码 POST请求代码 GET请求解释及语法格式: 网络请求默认是get 网络请求有很多种:GET查 POST改 ...

  2. [Android]proguard重新编译和如何不混淆第三方jar包

    转载自:http://glblong.blog.51cto.com/3058613/1536516 一.ant安装.环境变量配置及验证 (一)安装ant 到官方主页http://ant.apache. ...

  3. XML解析方案

    在iOS中,解析XML的手段有很多 苹果原生 NSXMLParser:SAX方式解析,使用简单 第三方框架 libxml2:纯C语言,默认包含在iOS SDK中,同时支持DOM和SAX方式解析 GDa ...

  4. django tmeplate 循环基数

    {% for item in item_list %} {{ forloop.counter }} {# starting index 1 #} {{ forloop.counter0 }} {# s ...

  5. 【问题排查记录】Field 'id' doesn't have a default value;

    错误信息: org.springframework.dao.DataIntegrityViolationException: StatementCallback; SQL [delete from t ...

  6. App.Config 和 WebConfig 特殊字符的转义码对应关系

    Web.Config默认编码格式为UTF-8,对于XML文件,要用到实体转义码来替换.对应关系如下: 字符 转义码 & 符号 & & 单引号 ' &apos; 双引号 ...

  7. WPF学习之路(十一)布局(续)

    布局实际上是一个Slot模型,其中每个父对象分配给子对象一个Slot,子对象可以自由占用Slot中的空间,通过Margin\VerticalAlignment\HorizontalAlignment控 ...

  8. webpack入门和实战(一):webpack配置及技巧

    一.全面理解webpack 1.什么是 webpack? webpack是近期最火的一款模块加载器兼打包工具,它能把各种资源,例如JS(含JSX).coffee.样式(含less/sass).图片等都 ...

  9. 区别和详解:js中call()和apply()的用法

    1.关于call()和apply()的疑点: apply和call的区别在哪里 什么情况下用apply,什么情况下用call apply的其他巧妙用法(一般在什么情况下可以使用apply) 2.语法和 ...

  10. MongoDB使用汇总贴

    金天:学习一个新东西,就要持有拥抱的心态,如果固守在自己先前的概念体系,就会有举步维艰的感觉.应用mongodb(NoSQL)开发,首先要打破原先的关系思维.范式思维. 本文作为使用mongodb一路 ...