【题解】Luogu P2604 [ZJOI2010]网络扩容
原题传送门:P2604 [ZJOI2010]网络扩容
这题可以说是板题
给你一个图,先让你求最大流
再告诉你,每条边可以花费一些代价,使得流量加一
问至少花费多少代价才能使最大流达到k
解法十分简单
先跑一个dinic求最大流(我懒着写ISAP或前弧优化)
再重新建图
跑一个mcmf求最小费用最大流
答案就出来了
细节见代码
#pragma GCC optimize("O3")
#include <bits/stdc++.h>
#define maxn 10005
#define maxm 50005
#define inf 0x7f7f7f7f
using namespace std;
inline int read()
{
int x=0,f=1;char ch=getchar();
while(ch<'0'||ch>'9'){if(ch=='-')f=-1;ch=getchar();}
while(ch>='0'&&ch<='9'){x=x*10+ch-'0';ch=getchar();}
return x*f;
}
inline int Min(register int a,register int b)
{
return a<b?a:b;
}
int n,m,k,tot,next[maxm<<1],beg[maxm<<1],head[maxn],flow[maxm<<1],fflow[maxm<<1],last[maxn],pre[maxn],fl[maxn],nxt[maxm<<1],to[maxm<<1],ccost[maxm<<1],cost[maxm<<1],d[maxn],dep[maxn];
bool vis[maxn];
inline void add(register int x,register int y,register int z,register int co,register int type)
{
nxt[++tot]=head[x];
head[x]=tot;
to[tot]=y;
beg[tot]=x;
flow[tot]=z;
fflow[tot]=type?z:0;
cost[tot]=type?co:0;
ccost[tot]=co;
}
inline bool bfs()
{
memset(dep,0,sizeof(dep));
queue<int> q;
q.push(1);
dep[1]=1;
while(!q.empty())
{
int x=q.front();
q.pop();
for(register int i=head[x];i;i=nxt[i])
{
int u=flow[i],v=to[i];
if(u>0&&!dep[v])
{
dep[v]=dep[x]+1;
q.push(v);
}
}
}
return dep[n];
}
inline int dfs(register int x,register int mini)
{
if(x==n)
return mini;
for(register int i=head[x];i;i=nxt[i])
{
int u=flow[i],v=to[i];
if(u>0&&dep[v]==dep[x]+1)
{
int dd=dfs(v,Min(mini,u));
if(dd>0)
{
flow[i]-=dd;
flow[i^1]+=dd;
return dd;
}
}
}
return 0;
}
inline int dinic()
{
int ret=0;
while(bfs())
{
int tmp=dfs(1,inf);
while(tmp)
{
ret+=tmp;
tmp=dfs(1,inf);
}
}
return ret;
}
inline bool spfa()
{
memset(d,0x7f,sizeof(d));
memset(fl,0x7f,sizeof(fl));
memset(vis,0,sizeof(vis));
queue<int> q;
q.push(n+1);
vis[n+1]=1;
d[n+1]=0;
pre[n]=-1;
while(!q.empty())
{
int now=q.front();
q.pop();
for(register int i=head[now];i;i=nxt[i])
{
int v=to[i];
if(fflow[i]>0&&d[v]>d[now]+cost[i])
{
d[v]=d[now]+cost[i];
pre[v]=now;
last[v]=i;
fl[v]=Min(fl[now],fflow[i]);
if(!vis[v])
{
vis[v]=1;
q.push(v);
}
}
}
vis[now]=0;
}
return pre[n]!=-1;
}
inline int mcmf()
{
int ret=0;
while(spfa())
{
int now=n;
ret+=fl[n]*d[n];
while(now!=n+1)
{
fflow[last[now]]-=fl[n];
fflow[last[now]^1]+=fl[n];
now=pre[now];
}
}
return ret;
}
inline void rebuild()
{
int cnt=tot;
for(register int i=2;i<=cnt;i+=2)
{
fflow[i]=flow[i];
fflow[i+1]=flow[i+1];
add(beg[i],to[i],inf,ccost[i],1);
add(to[i],beg[i],0,-ccost[i],1);
}
}
int main()
{
n=read(),m=read(),k=read();
add(n+1,1,k,0,1);
for(register int i=1;i<=m;++i)
{
int a=read(),b=read(),c=read(),d=read();
add(a,b,c,d,0),add(b,a,0,-d,0);
}
int ans1=dinic();
rebuild();
int ans2=mcmf();
printf("%d %d",ans1,ans2);
return 0;
}
【题解】Luogu P2604 [ZJOI2010]网络扩容的更多相关文章
- BZOJ 1834 Luogu P2604 [ZJOI2010]网络扩容 (最小费用最大流)
题目连接: (luogu) https://www.luogu.org/problemnew/show/P2604 (bzoj) https://www.lydsy.com/JudgeOnline/p ...
- 洛谷 P2604 [ZJOI2010]网络扩容 解题报告
P2604 [ZJOI2010]网络扩容 题目描述 给定一张有向图,每条边都有一个容量C和一个扩容费用W.这里扩容费用是指将容量扩大1所需的费用.求: 1. 在不扩容的情况下,1到N的最大流: 2. ...
- [Luogu 2604] ZJOI2010 网络扩容
[Luogu 2604] ZJOI2010 网络扩容 第一问直接最大流. 第二问,添加一遍带费用的边,边权 INF,超级源点连源点一条容量为 \(k\) 的边来限流,跑费用流. 大约是第一次用 nam ...
- [洛谷P2604][ZJOI2010]网络扩容
题目大意:给定一张有向图,每条边都有一个容量C和一个扩容费用W.这里扩容费用是指将容量扩大1所需的费用. 求: 1.在不扩容的情况下,1到N的最大流: 2.将1到N的最大流增加K所需的最小费用. 题解 ...
- P2604 [ZJOI2010]网络扩容
思路 简单的费用流问题,跑出第一问后在残量网络上加边求最小费用即可 代码 #include <cstdio> #include <algorithm> #include < ...
- 洛谷 P2604 [ZJOI2010]网络扩容
题目描述 给定一张有向图,每条边都有一个容量C和一个扩容费用W.这里扩容费用是指将容量扩大1所需的费用.求: 1. 在不扩容的情况下,1到N的最大流: 2. 将1到N的最大流增加K所需的最小扩容费用. ...
- 洛谷$P2604\ [ZJOI2010]$网络扩容 网络流
正解:网络流 解题报告: 传送门$QwQ$ 昂第一问跑个最大流就成不说$QwQ$ 然后第二问,首先原来剩下的边就成了费用为0的边?然后原来的所有边连接的两点都给加上流量为$inf$费用为$w$的边,保 ...
- BZOJ1834:[ZJOI2010]网络扩容——题解
http://www.lydsy.com/JudgeOnline/problem.php?id=1834 https://www.luogu.org/problemnew/show/P2604#sub ...
- 【洛谷 P2604】 [ZJOI2010]网络扩容(最大流,费用流)
题目链接 第一问就是简单的最大流. 第二问,保留第一问求完最大流的残量网络. 然后新建一个源点,向原源点连一条流量为k,费用为0的边. 然后所有边重新连一起(原来的边保留),费用为题目所给,最小费用即 ...
随机推荐
- numpy.newaxis()
np.newaxis 功能:为numpy.ndarray(多维数组)增加一个轴 np.newaxis 在使用和功能上等价于 None,查看源码发现:newaxis = None,其实就是 None 的 ...
- \r\n 回车换行浅析
\r \ 10 x0a return \n \ x0d newline Unix系统里,每行结尾只有“<换行>”,即“\n”: Windows系统里面,每行结尾是“<回车>&l ...
- MySQL数据类型--与MySQL零距离接触2-13MySQL唯一约束
虽然字段可以为空值,但是如果存储多个空值,如何确保唯一性?其实只会存储一个空值. 提示错误:Tom已经存储过,所以唯一约束在起作用. 一张表中:主键约束只能有一个,唯一约束可以有多个.在创建索引的时候 ...
- iOS UI进阶-4.0 地图与定位
在移动互联网时代,移动app能解决用户的很多生活琐事,比如 导航:去任意陌生的地方 周边:找餐馆.找酒店.找银行.找电影院 在上述应用中,都用到了地图和定位功能,在iOS开发中,要想加入这2大功能 ...
- cocosStudio制作ScrollView并在cocos2dx 3.0中使用。
使用cocosStudio制作界面基本已成为基础了,之前都是拖动一些 Image.Button的小控件,再用到层容器和滚动层的时候,习惯性的用拖动来改变控件的大小.但是你在把其他的控件拖动到上面的时候 ...
- UGUI之Image使用以及技能释放CD
顾名思义:Image就是用来显示图片的 Image中Image组件中有一个重要的熟悉:Image type
- numpy&pandas笔记
1.基础属性: array = np.array([[1,2,3],[2,3,4]]) #列表转化为矩阵 print('number of dim:',array.ndim) # 维度 # numbe ...
- !! MACD战法总结
我现在只发技术,不预测大盘.其实说实话,大盘不用预测,只要按照guoweijohn战法,有买入信号就入,有卖出信号就出..你也会成为股神..不是吹牛,且听慢慢分解 股市有三种市场: 一.牛市 二.震荡 ...
- KMP模板(bin)
KMP模板 主要是kuangbin的模板,之后加了一点我的习惯和理解. kmpN() 作用:构造next数组 参数:模式串,模式串长度 kmpC() 作用:返回模式串在主串中出现的次数(可重复) 参数 ...
- base64的编码
计算机中的数据一般是由ascii编码,来存储的, 0---31以及127,表示的是控制字符: 32-126表示的是字符,包括空格,阿拉伯数字,大小写字母: 之后的128个字符,是不可见的字符, 在网络 ...