Time Limit: 1000 ms   Memory Limit: 128 MB

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
 

Solution

  第一问直接上裸SPFA最大流,对于输入每条边$(u,v,f,c)$,流量设为输入的$f$,而费用设为0。(EK)

  对于第二问,考虑第一问完成后的残余网络。对于残余网络上的每一条边,理应都可以0费用扩容;而残余网络上不存在的边,扩容就需要$w$(反向弧为$-w$)。

  那么直接在第一问跑完后的残余网络上建图,对于输入的每一条边$(u,v,f,c)$,流量设为$+\infty$,费用设为$w$(反向弧$-w$)。

  这样在两种边下跑费用流,会优先选择原来残余网络上费用为$0$的边来增广,那么0费用扩容的边刻画完成;其他的边需要付出费用的,也可以体现。

  最后,由$n$连向一个超级汇点$T$,流量为$k$,费用为$0$,跑费用流即可。

 


  

#include <cstdio>
#include <queue>
using namespace std;
const int N=,M=,INF=;
int n,m,k,tot=,e[M][],h[N];
int S,T,dis[N],inq[N],pre[N],which[N];
struct Edge{int v,f,c,next;}g[M*];
queue<int> q;
inline void addEdge(int u,int v,int f,int c=){
g[++tot].v=v; g[tot].f=f; g[tot].c=c; g[tot].next=h[u]; h[u]=tot;
g[++tot].v=u; g[tot].f=; g[tot].c=-c; g[tot].next=h[v]; h[v]=tot;
}
bool spfa(){
while(!q.empty()) q.pop();
q.push(S);
for(int i=;i<=T;i++) dis[i]=INF,inq[i]=pre[i]=;
dis[S]=; inq[S]=;
while(!q.empty()){
int u=q.front(); q.pop();
for(int i=h[u],v;i;i=g[i].next)
if(g[i].f&&dis[u]+g[i].c<dis[v=g[i].v]){
dis[v]=dis[u]+g[i].c;
which[v]=i;
pre[v]=u;
if(!inq[v]){
inq[v]=;
q.push(v);
}
}
inq[u]=;
}
return dis[T]!=INF;
}
int solve(int type){
int mins,maxflow=,mincost=;
while(spfa()){
mins=INF;
for(int u=T;u!=S;u=pre[u])
if(g[which[u]].f<mins)
mins=g[which[u]].f;
maxflow+=mins; mincost+=mins*dis[T];
for(int u=T;u!=S;u=pre[u]){
g[which[u]].f-=mins;
g[which[u]^].f+=mins;
}
}
return !type?maxflow:mincost;
}
int main(){
scanf("%d%d%d",&n,&m,&k);
for(int i=;i<=m;i++){
scanf("%d%d%d%d",&e[i][],&e[i][],&e[i][],&e[i][]);
addEdge(e[i][],e[i][],e[i][]);
}
S=; T=n;
printf("%d ",solve());
T=n+;
addEdge(n,T,k,);
for(int i=;i<=m;i++)
addEdge(e[i][],e[i][],INF,e[i][]);
printf("%d\n",solve());
}

奇妙代码

【BZOJ1834】 网络扩容的更多相关文章

  1. BZOJ-1834 网络扩容 最小费用最大流+最大流+乱搞

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

  2. [ZJOI2010][bzoj1834] 网络扩容 [费用流]

    题面 传送门 思路 第一问:无脑网络流跑一波 第二问: 先考虑一个贪心的结论:扩容出来的扩容流量一定要跑满 证明显然 因此我们可以把扩容费用可以换个角度思考,变成增加一点流量,花费W的费用 这样,我们 ...

  3. bzoj1834 网络扩容 网络流

    好久没写题解了啊··· 题目大意: 给你一幅n个点的网络,先求出其1到n的最大流,每条弧还会有个属性\(cost_i\),表示没扩容一个单位的费用,现在我们要求的就是扩容K个单位的最小费用 思路: 这 ...

  4. bzoj1834 网络扩容

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

  5. 【BZOJ1834】网络扩容(最大流,费用流)

    [BZOJ1834]网络扩容(最大流,费用流) 题面 Description 给定一张有向图,每条边都有一个容量C和一个扩容费用W.这里扩容费用是指将容量扩大1所需的费用.求: 1. 在不扩容的情况下 ...

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

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

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

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

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

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

  9. 【bzoj1834】[ZJOI2010]network 网络扩容

    1834: [ZJOI2010]network 网络扩容 Time Limit: 3 Sec  Memory Limit: 64 MBSubmit: 2701  Solved: 1368[Submit ...

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

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

随机推荐

  1. Linux Shell 编程语法

    原文地址:http://www.cnblogs.com/fhefh/archive/2011/04/13/2014967.html.感谢作者的无私分享 编写代码 在计划好要程序干什么以及如何使用程序的 ...

  2. linkin大话设计模式--建造模式

    linkin大话设计模式--建造模式 建造模式是对象的创建模式,可以讲一个产品的内部表象与产品的生成过程分割开来,从而可以使一个建造过程生成具有不同的内部表象的产品对象. 建造模式的结构: 抽象建造者 ...

  3. linkin大话面向对象--组合

    继承是实现类重用的重要手段,但是它有一个最大的坏处:破坏封装.相比之下,组合也是实现类重用的重要方式,但是采用组合方式实现类重用则能提供更好的封装性.比如人有手一样,在人的类中增加一个手的属性. 何时 ...

  4. tcpdump 使用

    例子: 首先切换到root用户 tcpdump -w  aaa.cap   -i eth7   -nn -x  'port  9999'  -c  1 以例子说明参数: -w:输出到文件aaa.cap ...

  5. HTML5 拖放(Drag 和 Drop)详解与实例

    简介 拖放是一种常见的特性,即抓取对象以后拖到另一个位置. 在 HTML5 中,拖放是标准的一部分,任何元素都能够拖放. 先点击一个小例子:在用户开始拖动 <p> 元素时执行 JavaSc ...

  6. js—双等号引起的类型转换过程

    一.首先看双等号前后有没有NaN,如果存在NaN一律返回false 二.再看双等号前后有没有布尔,有布尔就将布尔转换为数字.(false是0,true是1) 三.接着看双等号前后有没有字符串,有三种情 ...

  7. JAVA设计模式---命令模式

    1.定义: 将“请求”封装成对象,以便使用不同的请求.队列或者日志来参数化其他对象,命令模式也支持可撤销的操作.命令可以用来实现日志和事务系统. 2.实例: 1)需求:设计一个家电遥控器的API,遥控 ...

  8. C#将图片背景从透明变成白色

    var img = System.Drawing.Image.FromStream(ms); int width = img.Width; int height = img.Height; var x ...

  9. zalenium 应用

    zalenium是一个Selenium Grid扩展,用Docker容器动态扩展你的本地网格.它使用docker-selenium在本地运行Firefox和Chrome中的测试,如果需要不同的浏览器, ...

  10. MIB Browser如何导入已编译的mib

    开发过程中,如果需要来回在几套mib之间来回切换,每次都进行编译工作那将是一件很繁琐的事情,我们可以直接导入已经编译好的mib文件,避免重复的编译工作. 第一步,备份已经编译好的mib文件.    将 ...