[ZJOI2010]网络扩容
OJ题号:
BZOJ1834、洛谷2604
思路:
对于第一问,直接跑一遍最大流即可。
对于第二问,将每条边分成两种情况,即将每条边拆成两个:
不需扩容,即残量大于零时,相当于这条边费用为$0$;
需要扩容,即残量等于零时,可以扩容很多次,将残量设为$inf$或者$k$(实际上最多扩容$k$次)。
由于$k≤10$,跑$k$遍流量为$1$的最小费用流即可。
#include<queue>
#include<cstdio>
#include<cctype>
#include<vector>
#include<cstring>
inline int getint() {
char ch;
while(!isdigit(ch=getchar()));
int x=ch^'';
while(isdigit(ch=getchar())) x=(((x<<)+x)<<)+(ch^'');
return x;
}
const int inf=0x7fffffff;
int n,m,k,s,t;
struct Edge {
int from,to,remain,cost;
};
const int E=,V=;
Edge e[E];
std::vector<int> g[V];
int sz=;
inline void add_edge(const int u,const int v,const int w,const int c) {
e[sz]=(Edge){u,v,w,c};
g[u].push_back(sz);
sz++;
}
int p[V],a[V];
inline int MFAugment() {
memset(a,,sizeof a);
a[s]=inf;
std::queue<int> q;
q.push(s);
while(!q.empty()&&!a[t]) {
int x=q.front();
q.pop();
for(unsigned i=;i<g[x].size();i++) {
Edge &y=e[g[x][i]];
if(!a[y.to]&&y.remain) {
p[y.to]=g[x][i];
a[y.to]=std::min(a[x],y.remain);
q.push(y.to);
}
}
}
return a[t];
}
inline int MF() {
int maxflow=;
while(int flow=MFAugment()) {
for(int i=t;i!=s;i=e[p[i]].from) {
e[p[i]].remain-=flow;
e[p[i]^].remain+=flow;
}
maxflow+=flow;
}
return maxflow;
}
int d[V];
bool inq[V];
inline int MCAugment() {
d[s]=;
for(int i=;i<=t;i++) d[i]=inf;
std::queue<int> q;
q.push(s);
memset(inq,,sizeof inq);
inq[s]=true;
while(!q.empty()) {
int x=q.front();
q.pop();
inq[x]=false;
for(unsigned i=;i<g[x].size();i++) {
Edge &y=e[g[x][i]];
if((d[x]+y.cost<d[y.to])&&y.remain&&(y.cost>=)) {
d[y.to]=d[x]+y.cost;
p[y.to]=g[x][i];
if(!inq[y.to]) {
q.push(y.to);
inq[y.to]=true;
}
}
}
}
return d[t];
}
inline int MC() {
int mincost=;
while(k--) {
int cost=MCAugment();
for(int i=t;i!=s;i=e[p[i]].from) {
e[p[i]].remain--;
e[p[i]^].remain++;
}
mincost+=cost;
}
return mincost;
}
int main() {
n=getint(),m=getint(),k=getint();
s=,t=n;
while(m--) {
int u=getint(),v=getint(),w=getint(),c=getint();
add_edge(u,v,w,c);
add_edge(v,u,,-c);
}
printf("%d ",MF());
int oldsz=sz;
for(int i=;i<oldsz;i++) {
int u=e[i].from,v=e[i].to,w=e[i].remain,c=e[i].cost;
e[i]=(Edge){u,v,w,};
add_edge(u,v,inf,c);
}
printf("%d\n",MC());
return ;
}
[ZJOI2010]网络扩容的更多相关文章
- 【题解】Luogu P2604 [ZJOI2010]网络扩容
原题传送门:P2604 [ZJOI2010]网络扩容 这题可以说是板题 给你一个图,先让你求最大流 再告诉你,每条边可以花费一些代价,使得流量加一 问至少花费多少代价才能使最大流达到k 解法十分简单 ...
- 洛谷 P2604 [ZJOI2010]网络扩容 解题报告
P2604 [ZJOI2010]网络扩容 题目描述 给定一张有向图,每条边都有一个容量C和一个扩容费用W.这里扩容费用是指将容量扩大1所需的费用.求: 1. 在不扩容的情况下,1到N的最大流: 2. ...
- [Luogu 2604] ZJOI2010 网络扩容
[Luogu 2604] ZJOI2010 网络扩容 第一问直接最大流. 第二问,添加一遍带费用的边,边权 INF,超级源点连源点一条容量为 \(k\) 的边来限流,跑费用流. 大约是第一次用 nam ...
- ZJOI2010网络扩容
无限orz hzwer神牛…… 第一问很简单,按数据建图,然后一遍最大流算法即可. 第二问则需要用最小费用最大流算法,主要是建图,那么可以从第一问的残留网络上继续建图,对残留网络上的每一条边建 ...
- BZOJ1834[ZJOI2010]网络扩容——最小费用最大流+最大流
题目描述 给定一张有向图,每条边都有一个容量C和一个扩容费用W.这里扩容费用是指将容量扩大1所需的费用. 求: 1.在不扩容的情况下,1到N的最大流: 2.将1到N的最大流增加K所需的最小扩容费用 ...
- 1834. [ZJOI2010]网络扩容【费用流】
Description 给定一张有向图,每条边都有一个容量C和一个扩容费用W.这里扩容费用是指将容量扩大1所需的费用. 求: 1.在不扩容的情况下,1到N的最大流: 2.将1到N的最大流增加K所需 ...
- BZOJ1834:[ZJOI2010]网络扩容——题解
http://www.lydsy.com/JudgeOnline/problem.php?id=1834 https://www.luogu.org/problemnew/show/P2604#sub ...
- [洛谷P2604][ZJOI2010]网络扩容
题目大意:给定一张有向图,每条边都有一个容量C和一个扩容费用W.这里扩容费用是指将容量扩大1所需的费用. 求: 1.在不扩容的情况下,1到N的最大流: 2.将1到N的最大流增加K所需的最小费用. 题解 ...
- bzoj1834 [ZJOI2010]网络扩容
Description 给定一张有向图,每条边都有一个容量C和一个扩容费用W.这里扩容费用是指将容量扩大1所需的费用.求: 1. 在不扩容的情况下,1到N的最大流: 2. 将1到N的最大流增加K所需的 ...
随机推荐
- git获取内核源码的方法
[转]http://www.360doc.com/content/17/0410/16/23107068_644444795.shtml 1. 前言 本文主要讲述ubuntu下通过git下载linux ...
- ubuntu 删除自带软件的方法
$ sudo dpkg -l | grep -i "need2del" $ sudo dpkg -P 或者: $ sudo apt-get --purge remove need2 ...
- php 日期格式转换万能公式
思路用strtotime转换时间的字符串 $t='2017-03-09 02:30'; echo(date('Y-m-d H-i', strtotime($t)));
- vux安装中遇到的坑
1.输入 npm install vux --save 2.输入 npm install vux-loader --save-dev(没安装的时候,会一直报错) 3.build/webpack.bas ...
- springboot系列三、springboot 单元测试、配置访问路径、多个配置文件和多环境配置,项目打包发布
一.单元测试 生成的demo里面包含spring-boot-starter-test :测试模块,包括JUnit.Hamcrest.Mockito,没有的手动加上. <dependency> ...
- 002_mtr_a network diagnostic tool
一. mtr combines the functionality of the traceroute and ping programs in a single network diagnostic ...
- 解决Idea运行testng套件无testoutput文件夹问题
说明:testNG的工程我是使用eclipse创建的,直接导入到idea中,运行test时不会生产test-output,只能在idea的控制台中查看运行结果,然后到处报告,经过不懈的百度终于找到怎么 ...
- Android studio下将项目代码上传至github包括更新,同步,创建依赖
AS中设置GIT 一.开篇 本文讲如何使用Android Studio将项目上传到github,虽然讲上传github的文章很多,但是大部分都是使用Git Bash命令行,虽然效率高些,但是有点麻烦, ...
- Python最佳学习路线图
python语言基础(1)Python3入门,数据类型,字符串(2)判断/循环语句,函数,命名空间,作用域(3)类与对象,继承,多态(4)tkinter界面编程(5)文件与异常,数据处理简介(6)Py ...
- Java 清理和垃圾回收
java.lang.ref.cleaner包 finalize()//该方法已过时,有风险,慎用 1.对象不可能被垃圾回收 2.垃圾回收并不等于"析构" 只有当垃圾回收发生时fin ...