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. NSoperation线程通信

    全局变量 @property (weak, nonatomic) IBOutlet UIImageView *imageView; @property (nonatomic, strong) NSOp ...

  2. Xcode快捷键大全

    转载地址http://www.360doc.com/content/12/0521/09/6541311_212458595.shtml.

  3. NSArray与NSMutableArray 数组与可变数组

    1.NSArray 是一个父类,NSMUtableArray是其子类,他们构成了OC的数组.2.NSArray的创建NSArray * array = [[NSArray alloc]initWith ...

  4. PHPMailer不能发送邮件

    PHPMailer不能连接SMTP服务器,和修改SMTP大小写没有关系 (2011-10-22 12:17:35) 转载▼ 标签: php phpmailer 杂谈 分类: 默认分类 PHPmaile ...

  5. XCLNetTools1.0(ASP.NET常用类库)

    版权声明:本文为博主原创文章,未经博主允许不得转载. 2016-01-01开放所有源代码: 项目地址:https://github.com/xucongli1989/XCLNetTools 下载地址: ...

  6. BFS、DFS与选课问题(拓扑排序)

    1选课问题 Leetcode上有这样一道题:有代号0,1,2……n-1的n门课程.其中选择某些课程需要另一些课程作为前提条件.用一组pair来表示这些条件:[1,0],[1,2],表示如果要选修课程1 ...

  7. select接收后台返回值的解决方案

    在做页面表单或者条件筛选的时候,如何把select标签的值,在刷新页面后,保持选择的值.下面,将给出两种解决方案: 前提: 前台select标签 name为type : 后台接收type的值,业务完成 ...

  8. 【故障处理】一次RAC故障处理过程

    [故障处理]一次RAC故障处理过程 1.1  故障环境介绍 项目 source db db 类型 2节点RAC db version 11.2.0.1.0 db 存储 ASM OS版本及kernel版 ...

  9. jQuery简单入门(三)

    3.事件和动画 A. 事件 Aa. DOM加载 1.为什么使用jQuery加载DOM方法? 以javascript的window.onload()方法加载DOM的先决条件是:必须等待被请求页面的资源全 ...

  10. IE10 11的css hack

    一.@media -ms-high-contrast @media screen and (-ms-high-contrast: active), (-ms-high-contrast: none){ ...