\(\\\)

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. NOIP 2010 乌龟棋

    P1541 乌龟棋 题目背景 小明过生日的时候,爸爸送给他一副乌龟棋当作礼物. 题目描述 乌龟棋的棋盘是一行 NN 个格子,每个格子上一个分数(非负整数).棋盘第1格是唯一的起点,第 NN 格是终点, ...

  2. Linux纯Shell实现DNSPod动态域名

    http://www.anrip.com/post/872 开发背景: 公司有台嵌入式拨号上网设备,内置busybox和完整wget命令(支持https协议),但没有curl.python.ruby. ...

  3. Moravec算子

    Moravec在1981年提出了Moravec角点检測算子,并将它应用于立体匹配.它是一种基于灰度方差的角点检測方法.该算子计算图像中某个像素点沿着水平.垂直.对角线.反对角线四个方向的灰度方差,当中 ...

  4. 系统的BIOS与系统安装

    今天偶尔看到个介绍电脑BIOS的与各种本子安装系统的介绍:(记录一下) 网络地址:http://blog.sina.com.cn/s/blog_4a1faae60102dyek.html

  5. java websocket开发的客户端程序

    最近用java websocket开发的客户端程序,在和服务端链接通后,在数据传输完毕后,客户端自动关闭了链接,如何能保持链接不断开 这个是客户端的启动类,在循环完毕后,会自动断开和服务器的链接,开始 ...

  6. J2SE基础:11.异常处理

    1:异常的概念: 异常是程序在执行时发生的事件(异常发生在执行期间). 程序出现错误.打断原本的运行流程. 2:Java中处理异常. 在Java中.异常被封装成一个对象.(属性和方法) 3:异常产生 ...

  7. 为什么要在css文件里定义 ul{margin:0;padding:0;}这个选择器?

    为什么要在css文件里定义 ul{margin:0;padding:0;}这个选择器? ul标签在FF中默认是有padding值的,而在IE中仅仅有margin默认有值.请看下面不同浏览中对paddi ...

  8. 谈谈C++私有继承

    很多C++程序猿从来没用过私有继承来设计他的类.的确,假设是本该用私有继承的地方却用了公有继承.对程序的功能的实现并无影响. 但这样的误用是一种错位的描写叙述.会引起阅读者的误解,甚至会引起类的使用者 ...

  9. Android源码的下载、编译与导入到Android Studio【转】

    本文转载自:http://wl9739.github.io/2016/05/09/Android%E6%BA%90%E7%A0%81%E7%9A%84%E4%B8%8B%E8%BD%BD%E3%80% ...

  10. YTU 2636: B3 指向基类的指针访问派生类的成员函数

    2636: B3 指向基类的指针访问派生类的成员函数 时间限制: 1 Sec  内存限制: 128 MB 提交: 433  解决: 141 题目描述 领导类(Leader)和工程师类(Engineer ...