只是搞一搞而已。

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相关推荐

  1. 模板:网络流(Dinic算法)

    文章目录 1.网络最大流 题目描述 解析 反悔边 分层(避免环流) 时间优化 代码 2.费用流 描述 解析 代码 1.网络最大流 洛谷P3376 题目描述 给出一个网络图,以及其源点和汇点,求出其网络 ...

  2. 网络流 (EK Dinic)

    Edmonds-Karp BFS找增广路,找到增广路,更新残余网络. // 临接矩阵 // pre记录前驱节点 int G[maxn][maxn], pre[maxn], vis[maxn], n, ...

  3. nyoj-239 月老的难题 (二分图匹配—匈牙利算法 网络流—Dinic算法)

    月老的难题 时间限制:1000 ms  |  内存限制:65535 KB 难度:4 描述 月老准备给n个女孩与n个男孩牵红线,成就一对对美好的姻缘. 现在,由于一些原因,部分男孩与女孩可能结成幸福的一 ...

  4. 网络流入门级学习报告(中)

    网络流建模的基础元素 最小割模型 最大权闭合子图问题 常见建模元素 为什么是网络流? 点和边的意义 拆点和限流 分集合和求割 "组合选取"问题 "选与不选"问题 ...

  5. 算法学习笔记:网络流#4——ISAP 求解最大流

    算法学习笔记:网络流#4--ISAP 求解最大流 1. 前言 2. 模板 2.1 详解 2.2 正确性证明 2.3 代码 3. 算法对比 3.1 一般数据下的对比 3.2 特殊数据下的对比 4. 总结 ...

  6. 竞赛程序设计知识要点图谱

    一.基础算法 1.枚举法 POJ1248 Safecracker HDU1172 猜数字 POJ1543 Perfect Cubes POJ1046 Color Me Less 2.递归法:Hanoi ...

  7. Note(读书笔记)

    首先在算法书的选择上,选择的是李煜东所著的<算法竞赛进阶指南>这本书,因为参加了学院的ACM竞赛实验室,这本书对本人的影响也很深,它涵盖了竞赛中大部分的算法,如基本算法二分.倍增.前缀和, ...

  8. 【个人整理】省选知识点汇总

    为啥hzwer写过我还要写呢 我也不知道--可能是黄学长的排版不好看 学省选的,先把我整理的NOIP知识点学完吧 同样的,加粗是重点,星号是选学 欢迎补充~ 图论 网络流(dinic,SAP,ISAP ...

  9. 网络流-Dinic求最大流(仅做自己复习,写的很不清楚)

    网络流-Dinic求最大流 2021.8.18 原理:网络流-EK求最大流 在Dinic求最大流中,d数组变成了步数的记录,pre数组变成了对其上一条路径的记录. bool bfs() {queue& ...

最新文章

  1. kafka源码分析(二)Metadata的数据结构与读取、更新策略
  2. python图像相似度识别_一个用SIFT特征比较图像相似度的python小程序
  3. gitlab8.2-8.16-8.17-9.0升级
  4. matlab 基于Topsis的熵权法2
  5. 新手用python2还是3-新手用python2还是3
  6. 洛谷P3773 [CTSC2017]吉夫特(Lucas定理,dp)
  7. 雅马哈发电机换机油教程_奥迪老A4B7 EA113 1.8T发动机严重烧机油大修彻底解决
  8. leetcode最小面积_LeetCode—— 939. 最小面积矩形(JavaScript)
  9. PyTorch+CUDA+cudnn安装
  10. HTML5css3学习总结(2)
  11. win10系统64位安装与配置java环境,安装使用citespace经验
  12. 六自由度机器人(机械臂)运动学建模及运动规划系列(一)——简介
  13. 中了勒索病毒怎么办|文件解密|文件恢复
  14. Windows10系统教育版和专业版区别在哪里?
  15. 自定义控件 TextView 歌词 Lrc
  16. 防止恶意刷新页面的Java实现
  17. 让学前端不再害怕英语单词(三)
  18. 任务管理器在打开的瞬间是CPU占用过大
  19. SelectObject和DeleteObject函数
  20. telnet协议的Wireshark抓包分析

热门文章

  1. 潜艇游戏-第13届蓝桥杯Scratch选拔赛真题精选
  2. 数学主题分类 - 中文(下)
  3. oracle 7天密码过期,Oracle 密码过期 ORA-28002: 7 天之后口令将过期 的解决方法
  4. arcgis的(添加面)点转线,线转面
  5. C/C++白盒测试工具之codeviz安装使用(续)
  6. 夺命雷公狗—玩转SEO---65---黑阔手法秒杀dede提升权重
  7. 数据标注丨7大数据标注工具分享
  8. 01 交通信号灯(附源码)
  9. PHP使用composer《MordenPHP》
  10. 27 《给人好印象的秘诀:如何让别人信任你、喜欢你、帮助你》 -豆瓣评分6.6