\(\\\)

Description


给定一张有向图,每条边都有一个容量 \(C\) 和一个扩容费用 \(W\)。

这里扩容费用是指将容量扩大 \(1\) 所需的费用。求:

  • 在不扩容的情况下, \(1\) 到 \(N\) 的最大流;

  • 将 \(1\) 到 \(N\) 的最大流增加 \(K\) 所需的最小扩容费用。

  • \(n\le 10^3,m\le 5\times 10^3,K\le 10\)

\(\\\)

Solution


注意残量网络的作用。

第一问直接最大流就好了。

主要是第二问。难道答案就是重建图求 \(K\) 股流的最小费用吗?

并不是,因为第一次跑完最大流剩下的残量网络里的边还可以接着用,并不需要花费代价扩容。

所以要在原图的基础上重建图,新编费用对应,流量上限为 \(\infty\) 。

跑一遍 \(K\) 股流的最小费用就可以了。

\(\\\)

Code


实现的时候其实可以直接跑费用流。

一开始的边费用为 \(0\) ,新加的边有费用即可。

注意 \(K\) 股流的时候需要讨论一下,否则增广路是无穷的。

#include<cmath>
#include<queue>
#include<cstdio>
#include<cctype>
#include<cstdlib>
#include<cstring>
#include<iostream>
#include<algorithm>
#define N 1010
#define M 20010
#define R register
#define gc getchar
#define inf 1000000000
using namespace std; inline int rd(){
int x=0; bool f=0; char c=gc();
while(!isdigit(c)){if(c=='-')f=1;c=gc();}
while(isdigit(c)){x=(x<<1)+(x<<3)+(c^48);c=gc();}
return f?-x:x;
} int n,m,tot=1,hd[N]; struct edge{int f,w,to,nxt;}e[M]; inline void add(int u,int v,int w,int f){
e[++tot].to=v; e[tot].nxt=hd[u];
e[tot].f=f; e[tot].w=w; hd[u]=tot;
} struct E{int u,v,w,f;}r[M]; int vis[N]; int s,t,k,id[N],pre[N],dis[N]; queue<int> q; inline bool spfa(){
for(R int i=1;i<=n;++i) dis[i]=inf,vis[i]=0;
dis[s]=0; q.push(s);
while(!q.empty()){
int u=q.front();
q.pop(); vis[u]=0;
for(R int i=hd[u],v;i;i=e[i].nxt)
if(e[i].f&&(dis[v=e[i].to]>dis[u]+e[i].w)){
dis[v]=dis[u]+e[i].w;
pre[v]=u; id[v]=i;
if(!vis[v]) vis[v]=1,q.push(v);
}
}
return dis[t]<inf;
} inline pair<int,int> mcmf(int lim){
int res=0,totf=0,tmp;
while(spfa()){
tmp=inf;
for(R int i=t;i!=s;i=pre[i]) tmp=min(tmp,e[id[i]].f);
for(R int i=t;i!=s;i=pre[i]){
e[id[i]].f-=tmp; e[id[i]^1].f+=tmp;
}
totf+=tmp;
if(totf>=lim){
res+=(tmp-(totf-lim))*dis[t];
break;
}
else res+=tmp*dis[t];
}
return make_pair(totf,res);
} int main(){
n=rd(); m=rd();
k=rd(); s=1; t=n;
for(R int i=1,u,v,f,w;i<=m;++i){
u=rd(); v=rd(); f=rd(); w=rd();
r[i]=(E){u,v,w,f};
add(u,v,0,f); add(v,u,0,0);
}
printf("%d ",mcmf(inf).first);
for(R int i=1,u,v,w;i<=m;++i){
u=r[i].u; v=r[i].v; w=r[i].w;
add(u,v,w,inf); add(v,u,-w,0);
}
printf("%d\n",mcmf(k).second);
return 0;
}

[ ZJOI 2010 ] 网络扩容的更多相关文章

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

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

  2. C++之路进阶——codevs1362(网络扩容)

    1362 网络扩容 省队选拔赛  时间限制: 2 s  空间限制: 128000 KB  题目等级 : 大师 Master     题目描述 Description 给定一张有向图,每条边都有一个容量 ...

  3. 【BZOJ】【1834】【ZJOI2010】Network 网络扩容

    网络流/费用流 这题……我一开始sb了. 第一问简单的最大流…… 第二问是要建费用流的图的……但是是在第一问的最大流跑完以后的残量网络上建,而不是重建…… 我们令残量网络上原有的弧的费用全部为0(因为 ...

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

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

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

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

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

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

  7. BZOJ_1834_[ZJOI2010]network 网络扩容_费用流

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

  8. 【题解】Luogu P2604 [ZJOI2010]网络扩容

    原题传送门:P2604 [ZJOI2010]网络扩容 这题可以说是板题 给你一个图,先让你求最大流 再告诉你,每条边可以花费一些代价,使得流量加一 问至少花费多少代价才能使最大流达到k 解法十分简单 ...

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

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

随机推荐

  1. django 名词解释

    1) 什么是slug http://stackoverflow.com/questions/427102/what-is-a-slug-in-django 如上链接红色部分就是slug,它就是链接的最 ...

  2. NHibernate之旅(8):巧用组件之依赖对象

    本节内容 引入 方案1:直接加入 方案2:巧用组件 实例分析 结语 引入 通过前面7篇的学习,有点乏味了~~~这篇来学习一个技巧.大家一起想想假设我要在Customer类中实现一个Fullname属性 ...

  3. Python的lambda函数与排序

    Python的lambda函数与排序 2010-03-02 15:02 2809人阅读 评论(0) 收藏 举报 lambdapythonlistlispclass工作   目录(?)[+]   前几天 ...

  4. Kernel Live-patching (by quqi99)

    作者:张华  发表于:2016-02-27 版权声明:能够随意转载.转载时请务必以超链接形式标明文章原始出处和作者信息及本版权声明 ( http://blog.csdn.net/quqi99 ) GC ...

  5. 跟踪oracle中sql语句运行过程及相关知识拓展

    select * from v$sqlarea; select * from v$sqlarea where first_load_time>'2010-11-27/09:30:00'; 这种方 ...

  6. Eclipse的安装使用

    1.从官网下载最新的Eclipse http://www.eclipse.org/downloads/

  7. 2015/12/30 字符集 ASCII 到Unicode

    ——每个软件开发人员应该无条件掌握的知识! ——Unicode伟大的创想! 相信大家一定碰到过,打开某个网页,却显示一堆像乱码,如"бЇЯАзЪСЯ"."�??????? ...

  8. Linux/Android——input系统之 kernel层 与 frameworks层交互 (五)【转】

    本文转载自:http://blog.csdn.net/jscese/article/details/42291149 之前的四篇博文记录的都是linux中的input体系相关的东西,最底层以我调试的u ...

  9. 转 source insight 复制后光标在前面

    source insight 里编辑的时候,每次粘贴后,光标停留在粘贴内容的前面. 我想把它设定为 粘贴后,光标移动倒粘贴内容的后面. 怎么做? 这是个设置问题,按照下面的步骤设定就可以了. Opti ...

  10. 利用Oracle内置分析函数进行高效统计汇总

      分析函数是Oracle从8.1.6开始引入的一个新的概念,为我们分析数据提供了一种简单高效的处理方式.在分析函数出现以前,我们必须使用自联查询,子查询或者内联视图,甚至复杂的存储过程实现的语句,现 ...