\(\\\)

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. Python/Java程序员面试必备常用问题解析与答案

    转自AI算法联盟,理解python技术问题,以及一些常见的java面试中经常遇到的问题,这些面试问题分为四类: 是什么(what) 如何做(how) 说区别/谈优势(difference) 实践操作( ...

  2. 一个简单的Java文件工具类

    package com.xyworkroom.ntko.util; import java.io.File; import java.io.FileInputStream; import java.i ...

  3. 分享最近抽空写的一个代码生成器,集成EasyDBUtility数据库访问帮助类

    一直想写一个自己的代码生成器,但是因为工作事情多,一直搁置下来,最近下决心终于利用下班时间写完了,现在分享给有需要的朋友,代码生成器集成EasyDBUtility数据库访问帮助类,暂时只支持sqlse ...

  4. Linux命令输出头(标题)、输出结果排序技巧

    原文:http://blog.csdn.net/hongweigg/article/details/65446007 ----------------------------------------- ...

  5. redis 事务 及发布于订阅功能

    事务: Redis事务可以一次执行多个命令,事务具有以下特征: 1.隔离操作:事务中的所有命令都会序列化.按顺序地执行,不会被其他命令打扰. 2.原子操作:事务中的命令要么全部被执行,要么全部都不执行 ...

  6. Android清单文件具体解释(四) ---- backupAgent的使用方法

    在<application>节点中有一个很重要的属性,那就是backupAgent.这里我们将它单独列出来,从基本含义,使用方法及其相关属性等方面来具体介绍一下. 1.backupAgen ...

  7. JavaScript 获得代码行号和脚本文件名

    如果你使用的是 V8 引擎,Chrome 和 Node.js 所用的,那么你可以利用 JavaScriptStackTraceApi 来获得行号信息,有两个 API: Error.captureSta ...

  8. 仰视源代码,实现strcmp

    //这是系统库的实现 int strcmp(const char* src, const char* dest) { int rtn = 0; while(!(rtn = *(unsigned cha ...

  9. c# 钩子

    1.setWindowsHookex详解 http://blog.csdn.net/mmllkkjj/article/details/6627188 函数功能:该函数将一个应用程序定义的挂钩处理过程安 ...

  10. Ubuntu14.04 x64 zabbix 3.0 安装

    U buntu14.04 x64   zabbix 3.0 安装 苦于网上的文档很多,但是对初学者来说,很多都搭建不成功,我重新安装一下.记录一下. 下载deb wget http://repo.za ...