当前位置: 首页 > news >正文

AcWing 2189:有源汇上下界最大流 ← Dinic算法

【题目来源】
https://www.acwing.com/problem/content/2191/

【题目描述】
给定一个包含 n 个点 m 条边的有向图,每条边都有一个流量下界和流量上界。
给定源点 S 和汇点 T,求源点到汇点的最大流。

【输入格式】
第一行包含四个整数 n,m,S,T。
接下来 m 行,每行包含四个整数 a,b,c,d,表示点 a 和 b 之间存在一条有向边,该边的流量下界为 c,流量上界为 d。
点编号从 1 到 n。

【输出格式】
输出一个整数表示最大流。
如果无解,则输出 No Solution。

【输入样例】
10 15 9 10
9 1 17 18
9 2 12 13
9 3 11 12
1 5 3 4
1 6 6 7
1 7 7 8
2 5 9 10
2 6 2 3
2 7 0 1
3 5 3 4
3 6 1 2
3 7 6 7
5 10 16 17
6 10 10 11
7 10 14 15

【输出样例】
43

【数据范围】
1≤n≤202,
1≤m≤9999 ,
1≤a,b≤n,
0≤c≤d≤10^5

【算法分析】
Dinic算法:https://blog.csdn.net/hnjzsyjyj/article/details/161317988


【算法代码】
A[N] —— 流量平衡差数组,记录每个点“流入 - 流出”的差值,判断是否存在可行流。
上下界网络流代码中的边数 M 至少要 2e5,否则随机样例炸。

#include <bits/stdc++.h> using namespace std; typedef long long LL; const int INF=0x3f3f3f3f; const int N=2e2+5,M=2e5+5; int h[N],e[M],ne[M],idx,f[M],low[M]; int q[N],cur[N],d[N],A[N]; int n,m,s,t,S,T; void add(int a,int b,int c,int d) { e[idx]=b,ne[idx]=h[a],f[idx]=d-c,low[idx]=c,h[a]=idx++; e[idx]=a,ne[idx]=h[b],f[idx]=0,h[b]=idx++; } bool bfs() { memset(d,-1,sizeof d); int hh=0,tt=0; q[0]=S,d[S]=0; while(hh<=tt) { int u=q[hh++]; for(int i=h[u]; ~i; i=ne[i]) { int v=e[i]; if(d[v]==-1 && f[i]) { d[v]=d[u]+1; q[++tt]=v; } } } return d[T]!=-1; } int dfs(int u,int lim) { if(u==T) return lim; int flow=0; for(int i=cur[u]; ~i && flow<lim; i=ne[i]) { cur[u]=i; int v=e[i]; if(d[v]==d[u]+1 && f[i]) { int t=dfs(v,min(f[i],lim-flow)); if(!t) d[v]=-1; f[i]-=t,f[i^1]+=t,flow+=t; } } return flow; } LL dinic() { LL r=0,flow=0; while(bfs()) { //0~T for(int i=0; i<=T; i++) cur[i]=h[i]; while(flow=dfs(S,INF)) r+=flow; } return r; } int main() { memset(h,-1,sizeof h); cin>>n>>m>>s>>t; S=0,T=n+1; for(int i=0; i<m; i++) { int a,b,c,d; cin>>a>>b>>c>>d; add(a,b,c,d); A[a]-=c,A[b]+=c; } int tot=0; for(int i=1; i<=n; i++) { if(A[i]>0) add(S,i,0,A[i]),tot+=A[i]; else if(A[i]<0) add(i,T,0,-A[i]); } add(t,s,0,INF); if(dinic()==tot) { LL res=f[idx-1]; S=s,T=t; f[idx-1]=f[idx-2]=0; cout<<res+dinic()<<endl; /*for(int k=1; k<=m; k++) { int i=2*(k-1); cout<<f[i^1]+low[i]<<endl; }*/ } else cout<<"No Solution\n"; return 0; } /* in: 10 15 9 10 9 1 17 18 9 2 12 13 9 3 11 12 1 5 3 4 1 6 6 7 1 7 7 8 2 5 9 10 2 6 2 3 2 7 0 1 3 5 3 4 3 6 1 2 3 7 6 7 5 10 16 17 6 10 10 11 7 10 14 15 out: 43 */




【参考文献】
https://blog.csdn.net/hnjzsyjyj/article/details/161438841
https://blog.csdn.net/hnjzsyjyj/article/details/161317988
https://blog.csdn.net/hnjzsyjyj/article/details/127179286
https://www.acwing.com/solution/content/123860/
https://www.acwing.com/solution/content/72754/


http://www.cnnetsun.cn/news/2599742.html

相关文章:

  • 论文查重竟然能免费?书匠策AI这个功能太香了,毕业党必看!
  • 紫垣商驿三轴试验数据处理软件
  • Modelsim和Vivado仿真器下,Testbench文件编写有哪些“坑”?我总结了3个避雷点
  • 从零打造可落地的直流电机 PID 驱动系统 (十四):编码器测速原理与速度环阶跃响应实测
  • VCAM虚拟相机:安卓摄像头替换的终极解决方案深度解析
  • 基于簇稀疏贝叶斯学习的混合大规模MIMO信道估计技术解析
  • 通过AntiDupl实现智能图片去重的高效方案
  • 双GAN融合与最大值策略:提升广义零样本动作识别的多模态特征生成
  • 钉钉消息防撤回补丁:职场沟通的终极信息保护方案
  • 五分钟教程使用Python在Taotoken上调用GPT模型
  • 通信网络领域SCI期刊JCN投稿全指南:从研究定位到录用策略
  • 基于RSSI方差的室内Wi-Fi指纹定位优化算法VFDA详解
  • 情境感知与自适应学习:UTROLL/KANTEAM移动语言学习系统架构解析
  • 5个技巧彻底改变你的Windows文件管理方式:QTTabBar完全指南
  • 模型广场功能详解如何为你的项目挑选合适的大模型
  • V模型驱动风电控制:从Simulink到STM32的DPC-PI算法工程化实践
  • 边缘AI实战:轻量级模型SqueezeNet与推理框架选型部署指南
  • 如何永久保存微信聊天记录?WeChatMsg年度报告生成终极指南
  • LeetDown技术解析:基于checkm8漏洞的iOS设备降级解决方案
  • 动态目标跨镜无缝接力追踪技术——军营出入口智能管控场景中的空间智能应用白皮书
  • 船载无人机自主降落:YOLOv8改进与多传感器融合实战
  • 2026 年广州专业 GEO 公司推荐
  • μSEDA:动态物联网群组认证方案,应对恶意节点与拓扑变化
  • 如何永久保存微信聊天记录?WeChatMsg完整指南:从备份到年度报告生成
  • 成本最优解:基于RAG+LoRA的实体企业本地化AI营销助手构建实践
  • 3步打造永久离线图书馆:番茄小说下载器完全指南
  • 如何用BG3脚本扩展器彻底改变你的博德之门3游戏体验?
  • Winhance中文版:让Windows系统重获新生的性能魔法三部曲
  • 智慧芽创新研究中心:2026年具身智能技术发展报告
  • 腾讯文档裁员风波:大厂“降本增效”背后的技术团队生存法则