dinic的核心在于分层和多路增广。

分层的意思是,对于图用bfs搜出每一层,避免出现dfs深度过深的情况。

多路增广,利用的是dfs的回溯性质,这样就可以在一个点增广出它的所有流量。

  1. #include <iostream>
  2. #include <stdio.h>
  3. #include <string.h>
  4. #include <queue>
  5. using namespace std;
  6. const int maxn=200100;
  7. const int INF=0x3f3f3f3f;
  8. int head[maxn];
  9. int val[maxn];
  10. int next[maxn];
  11. int to[maxn];
  12. int deep[maxn];
  13. int cnt=1,n,m,s,t;
  14. void addEdge(int u,int v,int w)
  15. {
  16. to[++cnt]=v;
  17. val[cnt]=w;
  18. next[cnt]=head[u];
  19. head[u]=cnt;
  20. }
  21. bool bfs()
  22. {
  23. memset(deep,0,sizeof(deep));
  24. deep[s]=1;
  25. queue<int> q;
  26. q.push(s);
  27. while (!q.empty()) {
  28. int u=q.front();
  29. q.pop();
  30. for (int i=head[u];i;i=next[i]) {
  31. int v=to[i];
  32. if (!deep[v]&&val[i]) {
  33. deep[v]=deep[u]+1;
  34. q.push(v);
  35. }
  36. }
  37. }
  38. return deep[t];
  39. }
  40. int dfs(int u,int in)
  41. {
  42. if (u==t) {
  43. return in;
  44. }
  45. int out=0;
  46. for (int i=head[u];i&&in;i=next[i]) {
  47. int v=to[i];
  48. if (val[i]&&deep[v]==deep[u]+1) {
  49. int res=dfs(v,min(val[i],in));
  50. val[i]-=res;
  51. val[i^1]+=res;
  52. in-=res;
  53. out+=res;
  54. }
  55. }
  56. if (out==0) {
  57. deep[u]=0;
  58. }
  59. return out;
  60. }
  61. int dinic()
  62. {
  63. int ans=0;
  64. while (bfs()) {
  65. ans+=dfs(s,INF);
  66. }
  67. return ans;
  68. }
  69. int main()
  70. {
  71. scanf("%d%d%d%d",&n,&m,&s,&t);
  72. while (m--) {
  73. int u,v,w;
  74. scanf("%d%d%d",&u,&v,&w);
  75. addEdge(u,v,w);
  76. addEdge(v,u,0);
  77. }
  78. printf("%d\n",dinic());
  79. return 0;
  80. }

P3376 【模板】网络最大流 dinic详解的更多相关文章

  1. P3376 [模板] 网络最大流

    https://www.luogu.org/blog/ONE-PIECE/wang-lao-liu-jiang-xie-zhi-dinic EK 292ms #include <bits/std ...

  2. fabric网络环境启动过程详解

    这篇文章对fabric的网络环境启动过程进行讲解,也就是我们上节讲到的启动测试fabric网络环境时运行network_setup.sh这个文件的执行流程 fabric网络环境启动过程详解 上一节我们 ...

  3. 自学Zabbix9.2 zabbix网络发现规则配置详解+实战

    点击返回:自学Zabbix之路 点击返回:自学Zabbix4.0之路 点击返回:自学zabbix集锦 自学Zabbix9.2 zabbix网络发现规则配置详解+实战 1.  创建网络发现规则 Conf ...

  4. Java网络编程和NIO详解开篇:Java网络编程基础

    Java网络编程和NIO详解开篇:Java网络编程基础 计算机网络编程基础 转自:https://mp.weixin.qq.com/s/XXMz5uAFSsPdg38bth2jAA 我们是幸运的,因为 ...

  5. Java网络编程和NIO详解4:浅析NIO包中的Buffer、Channel 和 Selector

    Java网络编程与NIO详解4:浅析NIO包中的Buffer.Channel 和 Selector 转自https://www.javadoop.com/post/nio-and-aio 本系列文章首 ...

  6. Java网络编程和NIO详解3:IO模型与Java网络编程模型

    Java网络编程和NIO详解3:IO模型与Java网络编程模型 基本概念说明 用户空间与内核空间 现在操作系统都是采用虚拟存储器,那么对32位操作系统而言,它的寻址空间(虚拟存储空间)为4G(2的32 ...

  7. Java网络编程和NIO详解1:JAVA 中原生的 socket 通信机制

    Java网络编程和NIO详解1:JAVA 中原生的 socket 通信机制 JAVA 中原生的 socket 通信机制 摘要:本文属于原创,欢迎转载,转载请保留出处:https://github.co ...

  8. 网络编程TCP/IP详解

    网络编程TCP/IP详解 1. 网络通信 中继器:信号放大器 集线器(hub):是中继器的一种形式,区别在于集线器能够提供多端口服务,多口中继器,每个数据包的发送都是以广播的形式进行的,容易阻塞网络. ...

  9. Docker Kubernetes Service 网络服务代理模式详解

    Docker Kubernetes  Service 网络服务代理模式详解 Service service是实现kubernetes网络通信的一个服务 主要功能:负载均衡.网络规则分布到具体pod 注 ...

随机推荐

  1. 2.7.2 元素定位:frame 内定位 driver.switch_to.frame()

    来源: http://blog.csdn.net/anniejunyan/article/details/23257327  Selenium + Webdriver 学习(五) frame下元素定位 ...

  2. windows 安装 MySQL

    windows 安装 MySQL MySQL 目录结构 成功完成 MySQL 数据库的安装和配置!

  3. 每天进步一点点------Allegro 蛇形走线

    对于高速数据总线,如果芯片内部没有延时调节功能,通常使用蛇形走线来调整延时以满足时序要求,也就是通常所说的等长线.蛇形走线的目的是调整延时,所以这一类网络都有延迟或相对延迟约束.所以在做蛇形走线调整时 ...

  4. [AGC027C]ABland Yard

    Description AGC027C 给定一张图,点有标号A或B,计算是否对于任意的一个由AB构成的字符串都在图中有对应的路径. Solution 观察可以发现,如果有个环(不一定是简单环)是AAB ...

  5. 搭建FEBS权限系统

    在码云看到一个FEBS权限系统,但是没有找到搭建手册,自己记录一下. 1.下载项目:https://github.com/wuyouzhuguli/FEBS-Shiro2.创建数据库:执行sql文件夹 ...

  6. buuctf 基础破解

    首先下载压缩包 解压之后发现是另一个压缩包 另一个压缩包上写着基础破解 然后用暴力破解的方法破解 然后搜了一下 暴力破解一般的长度是多少 然后搜到的结果是 长度为8的时候电脑都要破解好几年 所以我猜测 ...

  7. 概率DP lightoj 1265

    题意: 1.两只老虎相遇 就互相残杀 2.老虎与鹿相遇 鹿死 3.老虎与人相遇 人死 4.人与鹿相遇     鹿死 5.鹿与鹿相遇     无果 求人活的概率 解析:如果老虎为0  则人活得概率为1 ...

  8. element-ui里el-form的lable颜色怎么修改?

    就是把style改写成全局的,不要scoped(注意class,id的唯一,不要影响了整体布局) 链接:https://segmentfault.com/q/1010000017251094

  9. 如何在项目中新建.gitignore文件

    1. 在需要创建 .gitignore 文件的文件夹, 右键选择 Git Bash 进入命令行,进入项目所在目录. 2. 输入 touch .gitignore 在文件夹就生成了一个“.gitigno ...

  10. 3.CRUD(增删改查)

    Select 选择,查询语句 id:就是对应的namespace中的方法名: resultType:Sql语句执行的返回值: parameterType:参数类型 我们想使用查询语句首先要在UserM ...