study from:

https://blog.csdn.net/A_Comme_Amour/article/details/79356220

1.

Edmonds-Karp 无优化

最坏时间复杂度O(n*m*m) n为点数,m为边数

  1. #include <cstdio>
  2. #include <cstdlib>
  3. #include <cmath>
  4. #include <ctime>
  5. #include <cstring>
  6. #include <string>
  7. #include <map>
  8. #include <set>
  9. #include <list>
  10. #include <queue>
  11. #include <stack>
  12. #include <vector>
  13. #include <bitset>
  14. #include <algorithm>
  15. #include <iostream>
  16. using namespace std;
  17. #define ll long long
  18. const int maxn=1e4+;
  19. const int inf=1e9;
  20.  
  21. struct node
  22. {
  23. int d,len;
  24. node *next,*opp;
  25. }*e[maxn],*pre[maxn];
  26.  
  27. int sum=,s,t,add[maxn];
  28. queue<int> st;
  29. bool vis[maxn];
  30.  
  31. void add_edge(int x,int y,int len)
  32. {
  33. node *p1=(node*) malloc (sizeof(node));
  34. node *p2=(node*) malloc (sizeof(node));
  35.  
  36. p1->d=y;
  37. p1->len=len;
  38. p1->next=e[x];
  39. p1->opp=p2;
  40. e[x]=p1;
  41.  
  42. p2->d=x;///注意
  43. p2->len=;///注意
  44. p2->next=e[y];
  45. p2->opp=p1;
  46. e[y]=p2;
  47. }
  48.  
  49. void bfs()
  50. {
  51. int d,dd,v;
  52. node *p;
  53. while ()
  54. {
  55. memset(add,,sizeof(add));
  56. ///vis不用初始化
  57. add[s]=inf;
  58. vis[s]=;
  59. st.push(s);
  60. while (!st.empty())
  61. {
  62. d=st.front();
  63. st.pop();
  64. p=e[d];
  65. while (p)
  66. {
  67. dd=p->d;
  68. v=min(add[d],p->len);
  69. if (add[dd]<v)
  70. {
  71. add[dd]=v;
  72. pre[dd]=p->opp;
  73. if (!vis[dd])
  74. {
  75. vis[dd]=;
  76. st.push(dd);
  77. }
  78. }
  79. p=p->next;
  80. }
  81. vis[d]=;
  82. }
  83.  
  84. if (add[t]==)
  85. break;
  86.  
  87. sum+=add[t];
  88. d=t;
  89. while (d!=s)
  90. {
  91. pre[d]->len+=add[t];
  92. pre[d]->opp->len-=add[t];
  93. d=pre[d]->d;
  94. }
  95. }
  96. }
  97.  
  98. int main()
  99. {
  100. int n,m,x,y,z;
  101. scanf("%d%d%d%d",&n,&m,&s,&t);
  102. while (m--)
  103. {
  104. scanf("%d%d%d",&x,&y,&z);
  105. add_edge(x,y,z);
  106. }
  107. bfs();
  108. printf("%d",sum);
  109. return ;
  110. }

2.

study from https://www.luogu.org/problemnew/solution/P3376 第一个题解的dinic

dinic

  1. #include <cstdio>
  2. #include <cstdlib>
  3. #include <cmath>
  4. #include <ctime>
  5. #include <cstring>
  6. #include <string>
  7. #include <map>
  8. #include <set>
  9. #include <list>
  10. #include <queue>
  11. #include <stack>
  12. #include <vector>
  13. #include <bitset>
  14. #include <algorithm>
  15. #include <iostream>
  16. using namespace std;
  17. #define ll long long
  18. const int maxn=1e4+;
  19. const int inf=1e9;
  20.  
  21. struct node
  22. {
  23. int d,len;
  24. node *next,*opp;
  25. }*e[maxn];
  26.  
  27. int sum=,s,t;
  28. int q[maxn],dep[maxn];
  29. bool vis[maxn];
  30.  
  31. void add_edge(int x,int y,int len)
  32. {
  33. node *p1=(node*) malloc (sizeof(node));
  34. node *p2=(node*) malloc (sizeof(node));
  35.  
  36. p1->d=y;
  37. p1->len=len;
  38. p1->next=e[x];
  39. p1->opp=p2;
  40. e[x]=p1;
  41.  
  42. p2->d=x;
  43. p2->len=;///注意
  44. p2->next=e[y];
  45. p2->opp=p1;
  46. e[y]=p2;
  47. }
  48.  
  49. ///前面的网络流算法,每进行一次增广,都要做 一遍BFS,十分浪费。能否少做几次BFS?
  50.  
  51. bool bfs()
  52. {
  53. int head=,tail=,d,dd;
  54. node *p;
  55. memset(vis,,sizeof(vis));
  56. vis[s]=;
  57. dep[s]=;
  58. q[]=s;
  59.  
  60. while (head<tail)
  61. {
  62. head++;
  63. d=q[head];
  64. p=e[d];
  65. while (p)
  66. {
  67. dd=p->d;
  68. if (p->len> && !vis[dd])
  69. {
  70. tail++;
  71. q[tail]=dd;
  72. vis[dd]=;
  73. dep[dd]=dep[d]+;
  74. }
  75. p=p->next;
  76. }
  77. }
  78. if (vis[t])
  79. return ;
  80. return ;
  81. }
  82.  
  83. ///DFS找到一条增广路径后,并不立即结束,而是回溯后继续DFS寻找下一个增广路径
  84.  
  85. int dfs(int d,int add)
  86. {
  87. if (!add || d==t)
  88. return add;
  89. int totf=,f,dd;
  90. node *p=e[d];
  91. while (p)
  92. {
  93. dd=p->d;
  94. if (dep[dd]==dep[d]+ && (f=dfs(dd,min(add,p->len)))>)///注意
  95. {
  96. totf+=f;
  97. add-=f;///注意
  98. p->len-=f;
  99. p->opp->len+=f;
  100. }
  101. p=p->next;
  102. }
  103. return totf;
  104. }
  105.  
  106. int main()
  107. {
  108. int n,m,x,y,z;
  109. scanf("%d%d%d%d",&n,&m,&s,&t);
  110. while (m--)
  111. {
  112. scanf("%d%d%d",&x,&y,&z);
  113. add_edge(x,y,z);
  114. }
  115. while (bfs())
  116. sum+=dfs(s,inf);
  117. printf("%d",sum);
  118. return ;
  119. }

网络流 KM dinic的更多相关文章

  1. [知识点]网络流之Dinic算法

    // 此博文为迁移而来,写于2015年2月6日,不代表本人现在的观点与看法.原始地址:http://blog.sina.com.cn/s/blog_6022c4720102vrg4.html      ...

  2. [无效]网络流之Dinic算法

    // 此博文为迁移而来,写于2015年2月6日,不代表本人现在的观点与看法.原始地址:http://blog.sina.com.cn/s/blog_6022c4720102vrg4.html UPDA ...

  3. 「CODVES 1922 」骑士共存问题(二分图的最大独立集|网络流)&dinic

    首先是题目链接  http://codevs.cn/problem/1922/ 结果发现题目没图(心情复杂 然后去网上扒了一张图 大概就是这样了. 如果把每个点和它可以攻击的点连一条边,那问题就变成了 ...

  4. 初涉网络流[EK&dinic]

    主要还是板子 Edmonds-Karp 从S开始bfs,直到找到一条到达T的路径后将该路径增广,并重复这一过程. 在处理过程中,为了应对“找到的一条路径把其他路径堵塞”的情况,采用了建反向弧的方式来实 ...

  5. 网络流之Dinic算法

    初学网络流.存一下Dinic板子. 复杂度O(n^2*m) UVA - 1515 Pool construction 把每个草地与 S 相连,花费为dig,每个洞与 T 相连,花费为 然后对于每个两个 ...

  6. 网络流 之 dinic 算法

    网络流指的是:网络流(network-flows)是一种类比水流的解决问题方法.(类似于水管群,有一个源点(水无限多),和一个汇点,最大流就代表这个点水管群(边集)每秒最大能送道汇点的水量) 这个怎么 ...

  7. 初探网络流:dinic/EK算法学习笔记

    前记 这些是初一暑假的事: "都快初二了,连网络流都不会,你好菜啊!!!" from 某机房大佬 to 蒟蒻我. flag:--NOIP后要学网络流 咕咕咕------------ ...

  8. Secret Milking Machine POJ - 2455 网络流(Dinic算法---广搜判断+深搜增广)+时间优化+二分

    题意: 第一行输入N M C ,表示从1到N有M条无向边,现在要从1走到N 走C次完全不同的路径,求最长边的最小值.下面M行是从a点到b点的距离. 建图: 题上说从两点之间可以有多条边,问的是从1~N ...

  9. 【模板】【网络流】Dinic

    /* 唐代杜荀鹤 <小松> 自小刺头深草里,而今渐觉出蓬蒿. 时人不识凌云木,直待凌云始道高. */ #include <iostream> #include <cstd ...

随机推荐

  1. Java多线程的使用以及原理

    Java有两种方式实现多线程. 第一种——继承Thread类,并重写run方法 步骤: 定义类继承Thread类: 重写子类的run方法,将线程需要执行的代码写在run方法中: 创建子类的对象,则创建 ...

  2. Scrum Meeting day 4

                第四次会议 No_00:工作情况 No_01:任务说明 待完成 已完成 No_10:燃尽图 No_11:照片记录 待更新 No_100:代码/文档签入记录 No_101:出席表 ...

  3. 《Linux内核设计与实现》读书笔记三

    Chapter 18 调 试 18.1 准备开始 1.准备工作: 一个bug 一个藏匿bug的内核版本 相关内核代码的知识和运气 2.执行foo就会让程序立即产生核心信息转储(dump core). ...

  4. html5制作导航条

    (1)background-repeat:no-repeat;图片不平铺 (2)使用<ul>和<li>便签,代码简介有序.易于编排. (3)在引入外部css文件时,<li ...

  5. 《面向对象程序设计》c++第五次作业___calculator plus plus

    c++第五次作业 Calculator plusplus 代码传送门 PS:这次作业仍然orz感谢一位同学与一位学长的windows帮助,同时再次吐槽作业对Mac系统用户的不友好.(没朋友千万别用Ma ...

  6. Apache+php安装和配置 windows

    Apache+php安装和配置 windows Apache 安装 1.官网网址:http://httpd.apache.org/ 2.Download 3.点击链接Files for Microso ...

  7. Jquery Jquery对象和DOM对象的微妙联系

    声明变量 var  $variable=             Jquery 对象: var  varibake=             DOM对象: var $cr= $("#id&q ...

  8. ubuntu ftp服务

    apt-get install vsftpd apt-get update vi /etc/apt/sources.list vim  /etc/vsftpd.conf service vsftpd ...

  9. BOM嵌套简单写法

    WITHTREE AS( SELECT a.FItemID cfitemid,b.FItemID pfitemid FROM dbo.ICBOMChild a,dbo.ICBOM b WHERE a. ...

  10. std::string 字符串替换

    std::string 没有原生的字符串替换函数,需要自己来完成 string& replace_str(string& str, const string& to_repla ...