【网络流】——搞搞dinic
只是搞一搞而已。
https://www.luogu.org/problem/P3376网络流最大流板子。
程序大部分参考自A_Comme_Amour大大的题解。
Dinic:
1.从s跑一遍bfs来分层,如果能分到t层,请转至2。
2.跑dfs,求出当前的flow,加到答案中,欲知细节请到3。
3.dfs(u,t,lim)表示(当前点,汇点,路上最小弧),首先预判一下两种情况:(1.到汇点了,即u==t 2.最小弧为0,即lim==0,都可以直接return lim)
然后跑dfs:往哪个方向走?(往分层处,即新点深度是旧点+1,并且能走(f=dfs(v,t,min(lim,w)),即找增广路),这时候更新路径:原路-f,反向+f,flow+f,lim-f,判断一下lim如果小于等于0就不用再往下增广了。最后返回flow。
4.最后返回flow的和就好了。
5.可以选择弧优化,一点小细节,具体看程序:
1 #include<iostream> 2 #include<cstdio> 3 #include<cstring> 4 #include<queue> 5 using namespace std; 6 const int inf=1e9; 7 const int N=1e6+10; 8 int n,m,S,T,cnt=-1,maxflow,head[N],cur[N],deep[N]; 9 queue<int> q; 10 struct edge{ 11 int to,next,w; 12 }e[N*2]; 13 void addedge(int from,int to,int w){ 14 e[++cnt]=(edge){to,head[from],w}; 15 head[from]=cnt; 16 } 17 int bfs(int s,int t){//将图分层。 18 for(int i=1;i<=n;i++) deep[i]=1e9+10; 19 while(!q.empty()) q.pop(); 20 for(int i=1;i<=n;i++) cur[i]=head[i]; 21 deep[s]=0; 22 q.push(s); 23 while(!q.empty()){ 24 int u=q.front(); 25 q.pop(); 26 for(int i=head[u];i!=-1;i=e[i].next){ 27 int v=e[i].to; 28 if(deep[v]>inf&&e[i].w){ 29 deep[v]=deep[u]+1; 30 q.push(v); 31 } 32 } 33 } 34 if(deep[t]<inf) return true; 35 else return false; 36 } 37 int dfs(int u,int t,int lim){//lim=minedge(s->u) 38 if(!lim||u==t) return lim;//如果到了汇点或者边权为0则返回边权。 39 int flow=0,f; 40 for(int i=cur[u];i!=-1;i=e[i].next){ 41 cur[u]=i;//弧优化 42 int v=e[i].to; 43 if(deep[v]==deep[u]+1&&(f=dfs(v,t,min(lim,e[i].w)))){//如果这段能到达汇点并且服从分层 44 flow+=f; 45 lim-=f; 46 e[i].w-=f; 47 e[i^1].w+=f; 48 if(!lim) break; 49 } 50 } 51 return flow; 52 }//important 53 void dinic(int s,int t){ 54 while(bfs(s,t)){ 55 maxflow+=dfs(s,t,inf); 56 } 57 } 58 int main(){ 59 scanf("%d%d%d%d",&n,&m,&S,&T); 60 int x,y,z; 61 memset(head,-1,sizeof(head)); 62 for(int i=1;i<=m;i++){ 63 scanf("%d%d%d",&x,&y,&z); 64 addedge(x,y,z); 65 addedge(y,x,0); 66 } 67 dinic(S,T); 68 printf("%d",maxflow); 69 return 0; 70 }
本来想搞ISAP,但是懒,鸽着吧。
转载于:https://www.cnblogs.com/Nelson992770019/p/11285448.html
【网络流】——搞搞dinic相关推荐
- 模板:网络流(Dinic算法)
文章目录 1.网络最大流 题目描述 解析 反悔边 分层(避免环流) 时间优化 代码 2.费用流 描述 解析 代码 1.网络最大流 洛谷P3376 题目描述 给出一个网络图,以及其源点和汇点,求出其网络 ...
- 网络流 (EK Dinic)
Edmonds-Karp BFS找增广路,找到增广路,更新残余网络. // 临接矩阵 // pre记录前驱节点 int G[maxn][maxn], pre[maxn], vis[maxn], n, ...
- nyoj-239 月老的难题 (二分图匹配—匈牙利算法 网络流—Dinic算法)
月老的难题 时间限制:1000 ms | 内存限制:65535 KB 难度:4 描述 月老准备给n个女孩与n个男孩牵红线,成就一对对美好的姻缘. 现在,由于一些原因,部分男孩与女孩可能结成幸福的一 ...
- 网络流入门级学习报告(中)
网络流建模的基础元素 最小割模型 最大权闭合子图问题 常见建模元素 为什么是网络流? 点和边的意义 拆点和限流 分集合和求割 "组合选取"问题 "选与不选"问题 ...
- 算法学习笔记:网络流#4——ISAP 求解最大流
算法学习笔记:网络流#4--ISAP 求解最大流 1. 前言 2. 模板 2.1 详解 2.2 正确性证明 2.3 代码 3. 算法对比 3.1 一般数据下的对比 3.2 特殊数据下的对比 4. 总结 ...
- 竞赛程序设计知识要点图谱
一.基础算法 1.枚举法 POJ1248 Safecracker HDU1172 猜数字 POJ1543 Perfect Cubes POJ1046 Color Me Less 2.递归法:Hanoi ...
- Note(读书笔记)
首先在算法书的选择上,选择的是李煜东所著的<算法竞赛进阶指南>这本书,因为参加了学院的ACM竞赛实验室,这本书对本人的影响也很深,它涵盖了竞赛中大部分的算法,如基本算法二分.倍增.前缀和, ...
- 【个人整理】省选知识点汇总
为啥hzwer写过我还要写呢 我也不知道--可能是黄学长的排版不好看 学省选的,先把我整理的NOIP知识点学完吧 同样的,加粗是重点,星号是选学 欢迎补充~ 图论 网络流(dinic,SAP,ISAP ...
- 网络流-Dinic求最大流(仅做自己复习,写的很不清楚)
网络流-Dinic求最大流 2021.8.18 原理:网络流-EK求最大流 在Dinic求最大流中,d数组变成了步数的记录,pre数组变成了对其上一条路径的记录. bool bfs() {queue& ...
最新文章
- kafka源码分析(二)Metadata的数据结构与读取、更新策略
- python图像相似度识别_一个用SIFT特征比较图像相似度的python小程序
- gitlab8.2-8.16-8.17-9.0升级
- matlab 基于Topsis的熵权法2
- 新手用python2还是3-新手用python2还是3
- 洛谷P3773 [CTSC2017]吉夫特(Lucas定理,dp)
- 雅马哈发电机换机油教程_奥迪老A4B7 EA113 1.8T发动机严重烧机油大修彻底解决
- leetcode最小面积_LeetCode—— 939. 最小面积矩形(JavaScript)
- PyTorch+CUDA+cudnn安装
- HTML5css3学习总结(2)
- win10系统64位安装与配置java环境,安装使用citespace经验
- 六自由度机器人(机械臂)运动学建模及运动规划系列(一)——简介
- 中了勒索病毒怎么办|文件解密|文件恢复
- Windows10系统教育版和专业版区别在哪里?
- 自定义控件 TextView 歌词 Lrc
- 防止恶意刷新页面的Java实现
- 让学前端不再害怕英语单词(三)
- 任务管理器在打开的瞬间是CPU占用过大
- SelectObject和DeleteObject函数
- telnet协议的Wireshark抓包分析
热门文章
- 潜艇游戏-第13届蓝桥杯Scratch选拔赛真题精选
- 数学主题分类 - 中文(下)
- oracle 7天密码过期,Oracle 密码过期 ORA-28002: 7 天之后口令将过期 的解决方法
- arcgis的(添加面)点转线,线转面
- C/C++白盒测试工具之codeviz安装使用(续)
- 夺命雷公狗—玩转SEO---65---黑阔手法秒杀dede提升权重
- 数据标注丨7大数据标注工具分享
- 01 交通信号灯(附源码)
- PHP使用composer《MordenPHP》
- 27 《给人好印象的秘诀:如何让别人信任你、喜欢你、帮助你》 -豆瓣评分6.6