\(\\\)

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. JVM(二):Java中的语法糖

    JVM(二):Java中的语法糖 上文讲到在语义分析中会对Java中的语法糖进行解糖操作,因此本文就主要讲述一下Java中有哪些语法糖,每个语法糖在解糖过后的原始代码,以及这些语法糖背后的逻辑. 语法 ...

  2. 013 IPv6

    Router>en Router#config t Enter configuration commands, one per line.  End with CNTL/Z. Router(co ...

  3. HTML5: 本地缓存

    实现前端缓存,除了自己创建js保存(參考:http://blog.csdn.net/clementad/article/details/46807641).还能够利用html5的storage方法. ...

  4. .net mvc4 + ajaxfileupload.js 解决IE浏览器中弹出下载对话框问题

    摘要:每一个人遇到的问题都不一样,在网上找了一大圈都没有解决到我的问题!由于我的环境如标题所看到的.攻克了这个问题. 主要问题:在于响应头的设置 Controller: [HttpPost] publ ...

  5. Canvas: trying to use a recycled bitmap android.graphics.Bitmap@XXX

    近期在做和图片相关显示的出现了一个问题,整理一下思路.分享出来给大家參考一下: Exception Type:java.lang.RuntimeException java.lang.RuntimeE ...

  6. 在C++代码中调用L脚本语言

    L脚本语言同意被其他编程语言调用.如C++,非常easy.仅仅要在宿主语言中载入L脚本引擎的动态库 直接调用这两个函数就能够了 extern "C" int __stdcall S ...

  7. 2016/2/22 1、DOM的基本概念 2、Window对象操作 3、Windows.history对象 4、Window.location对象 5、Window.status对象

    1.DOM的基本概念 DOM是文档对象模型,这种模型为树模型:文档是指标签文档:对象是指文档中每个元素:模型是指抽象化的东西. 2.Window对象操作 一.属性和方法: 属性(值或者子对象): op ...

  8. Windows10、ARM开发板、VMware虚拟机同时连接Internet

    前段时间有人遇到一些网络连接问题,让我帮忙处理,他想让ARM开发板连接外网,可以连接网络数据库,同时保证自己的电脑可以上网. 本来说直接可以连接一个路由器,分配一个内网IP给ARM就可以了,但是当时那 ...

  9. Error:(2, 0) No service of type Factory<LoggingManagerInternal> available in ProjectScopeServices. <

    compile报下面的错误Error:(2, 0) No service of type Factory available in ProjectScopeServices. 点击open file ...

  10. 用C语言实现websocket服务器

    Websocket Echo Server Demo 背景 嵌入式设备的应用开发大都依靠C语言来完成,我去研究如何用c语言实现websocket服务器也是为了在嵌入式设备中实现一个ip camera的 ...