BZOJ 1834 Luogu P2604 [ZJOI2010]网络扩容 (最小费用最大流)
题目连接: (luogu) https://www.luogu.org/problemnew/show/P2604
(bzoj) https://www.lydsy.com/JudgeOnline/problem.php?id=1834
题解: 第一问所有的费用全按\(0\)建,跑完了之后很自然想到利用残余网络。
把\(n\)和一个新点\(T\)连边,然后原来的残量网络保留,在此基础上对于原来的每条边流量均按\(+\inf\)建,费用为原始费用再跑一遍即可。
时间复杂度\(O(MaxFlowMinCost(n,m))\)
(然而智障的我不会处理残量网路还想做\(K\)次费用流每次\(+1\),真是没脑子)
代码
#include<cstdio>
#include<cstdlib>
#include<cstring>
#include<algorithm>
#define llong long long
using namespace std;const int N = 1002;
const int M = 10000;
const llong INF = 1000000000000ll;
struct Edge
{int u,v,nxt,rev; llong c,w;
} e[(M<<1)+3];
Edge ae[M+3];
int fe[N+3];
int que[N+3];
llong dis[N+3];
bool inq[N+3];
int lst[N+3];
int n,m,en,p,s,t;
llong mf,mc;void addedge(int u,int v,llong w,llong c)
{en++; e[en].u = u; e[en].v = v; e[en].w = w; e[en].c = c;e[en].nxt = fe[u]; fe[u] = en; e[en].rev = en+1;en++; e[en].u = v; e[en].v = u; e[en].w = 0; e[en].c = -c;e[en].nxt = fe[v]; fe[v] = en; e[en].rev = en-1;
}bool spfa()
{for(int i=1; i<=n; i++) dis[i] = INF;int head = 1,tail = 2; que[tail-1] = s; dis[s] = 0ll;while(head!=tail){int u = que[head]; head++; if(head==n+1) head = 1;for(int i=fe[u]; i; i=e[i].nxt){if(e[i].w>0 && dis[e[i].v]>dis[u]+e[i].c){dis[e[i].v] = dis[u]+e[i].c;lst[e[i].v] = i;if(!inq[e[i].v]){inq[e[i].v] = true;que[tail] = e[i].v; tail++; if(tail==n+1) tail = 1;}}}inq[u] = false;}return dis[t]!=INF;
}void calcflow()
{llong flow = INF;for(int i=t; i!=s; i=e[lst[i]].u){flow = min(flow,e[lst[i]].w);}for(int i=t; i!=s; i=e[lst[i]].u){e[lst[i]].w -= flow; e[e[lst[i]].rev].w += flow;}mf += flow; mc += flow*dis[t];
}void mfmc()
{while(spfa()){calcflow();}
}int main()
{scanf("%d%d%d",&n,&m,&p);for(int i=1; i<=m; i++){scanf("%d%d%lld%lld",&ae[i].u,&ae[i].v,&ae[i].w,&ae[i].c);addedge(ae[i].u,ae[i].v,ae[i].w,0ll);}s = 1; t = n; mf = mc = 0ll;mfmc();printf("%lld ",mf);n++; addedge(n-1,n,p,0); t = n;for(int i=1; i<=m; i++){addedge(ae[i].u,ae[i].v,INF,ae[i].c);}mf = mc = 0ll;mfmc();printf("%lld\n",mc);return 0;
}
BZOJ 1834 Luogu P2604 [ZJOI2010]网络扩容 (最小费用最大流)相关推荐
- P2604 ZJOI2010 网络扩容,费用流裸题
网络扩容 题目链接 https://www.luogu.org/problemnew/show/P2604 题解 对于每条边u→vu \rightarrow vu→v,我们将按照容量=C=C=C,费用 ...
- P2604 [ZJOI2010]网络扩容
思路 简单的费用流问题,跑出第一问后在残量网络上加边求最小费用即可 代码 #include <cstdio> #include <algorithm> #include < ...
- BZOJ 4819 Luogu P3705 [SDOI2017]新生舞会 (最大费用最大流、二分、分数规划)
现在怎么做的题都这么水了.. 题目链接: (bzoj) https://www.lydsy.com/JudgeOnline/problem.php?id=4819 (luogu) https://ww ...
- bzoj 4108: [Wf2015]Catering|带上下界最小费用可行流
终于搞懂 上下界网络流了! 注意边的数量 #include <cstdio> #include <cstring> #include <iostream> #inc ...
- 网络流----最小费用最大流(EK+SPFA)
先来介绍一下什么是费用流(部分内容参考bilibili董晓算法) 给定一个网络G=(V,E),每条边有容量限制w(u,v),还有单位流量的费用c(u,v). 当(u,v)的流量为f(u,v)时,需要花 ...
- bzoj 1834: [ZJOI2010]network 网络扩容【最大流+最小费用最大流】
第一问直接跑最大流即可.建图的时候按照费用流建,费用为0. 对于第二问,在第一问dinic剩下的残量网络上建图,对原图的每条边(i,j),建(i,j,inf,cij),表示可以用c的花费增广这条路.然 ...
- [ZJOI2010]网络扩容[网络流24题]
[ZJOI2010]网络扩容[网络流24题] 题意: 给定一张有向图,每条边都有一个容量 c 和一个扩容费用 w.这里扩容费用是指将容量扩大 1 所需的费用.求: 在不扩容的情况下,1 到 n 的最大 ...
- BZOJ 1920 Luogu P4217 [CTSC2010]产品销售 (模拟费用流、线段树)
题目链接 (bzoj) https://www.lydsy.com/JudgeOnline/problem.php?id=1920 (luogu) https://www.luogu.org/prob ...
- 乌鲁木齐网络赛J题(最小费用最大流模板)
ACM ICPC 乌鲁木齐网络赛 J. Our Journey of Dalian Ends 2017-09-09 17:24 243人阅读 评论(0) 收藏 举报 分类: 网络流(33) 版权声 ...
最新文章
- iOS之深入解析AppDelegate重构
- 一行 Python 代码轻松构建树状热力图
- 《子弹笔记术》[日]杉野干人(作者)epub+mobi+azw3格式下载
- 数组遍历VS对象遍历
- vue 给iframe设置src_vue组件中使用iframe元素
- 可伸缩架构-面向增长应用的高可用
- centos7 挂载镜像盘 LVM处理的不合理
- redis 分布式锁流程图
- 应用安全-安全设备-Waf系列-软Waf-安全狗(Safedog)
- java中的servlet_关于JavaWeb中Servlet的总结
- [渝粤教育] 郑州科技学院 数控加工技术 参考 资料
- K8S报error: You must be logged in to the server错误
- word文件打不开怎么办?显示的是:调试,发送错误报告,不发送
- 【ResNet残差网络解析】
- amd linux raid,RAID的详解
- android9使用type-c接口,插入线控耳机与数据线监听混乱
- R语言如何从外部读取数据到R中
- win10系统禁用笔记本自带键盘
- 微信小程序实现瀑布流布局
- 天馈线频谱综合信号测试仪是什么 什么品牌的好用
热门文章
- ETPS英文文本处理软件
- 威联通服务器显示磁盘为挂载,如何在 QNAP NAS 上使用虚拟磁盘?
- yolov3安卓实现_重磅!MobileNet-YOLOv3来了(含三种框架开源代码)
- 怎么把网页源码家入hexo博客_一款被大厂选用的 Hexo 博客主题
- delphi中的bpl开发注意事项
- 【CyberSecurityLearning 70】DC系列之DC-1渗透测试(Drupal)
- shadow ssdt学习笔记
- idea包名呈现层级显示
- 异常解决(二)-- AttributeError: cannot assign module before Module.__init__() call
- java 高级数据类型_java 数据类型(上):分类