不断用BFS构造分层网络,用DFS增广。中途用取指的cur优化DFS。

Dinic封装模板:

  1. #include <cstdio>
  2. #include <iostream>
  3. #include <algorithm>
  4. #include <cstring>
  5. #include <cmath>
  6. #include <queue>
  7. using namespace std;
  8. typedef long long L;
  9. const int maxn = + ;
  10. const int maxm = + ;
  11. const int INF = -1u >> ;
  12. int fch[maxn], n, m;
  13. L ans = ;
  14. bool vis[maxn];
  15. struct Tedge{
  16. int from, to, cap, flow, next;
  17. }adj[maxm];
  18. struct Dinic{
  19. int S, T, n, ms;
  20. int d[maxn], cur[maxn], fch[maxn];
  21. void init(int n){
  22. this -> n = n;
  23. memset(fch, -, sizeof(fch));
  24. ms = ;
  25. return ;
  26. }
  27. void AddEdge(int u, int v, int c){
  28. adj[ms] = (Tedge){u, v, c, , fch[u]};
  29. fch[u] = ms ++;
  30. adj[ms] = (Tedge){v, u, , , fch[v]};
  31. fch[v] = ms ++;
  32. return ;
  33. }
  34. bool BFS(){
  35. memset(vis, , sizeof(vis));
  36. queue<int> Q;
  37. Q.push(S); vis[S] = true; d[S] = ;
  38. while(!Q.empty()){
  39. int x = Q.front(); Q.pop();
  40. for(int i = fch[x]; i != -; i = adj[i].next){
  41. Tedge& e = adj[i];
  42. if(!vis[e.to] && e.cap > e.flow){
  43. vis[e.to] = true;
  44. d[e.to] = d[x] + ;
  45. Q.push(e.to);
  46. }
  47. }
  48. }
  49. return vis[T];
  50. }
  51. int DFS(int x, int a){
  52. if(x == T || !a) return a;
  53. int flow = , f;
  54. for(int& i = cur[x]; i != -; i = adj[i].next){
  55. Tedge& e = adj[i];
  56. if(d[e.to] == d[x] + && (f = DFS(e.to, min(a, e.cap - e.flow))) > ){
  57. flow += f;
  58. a -= f;
  59. e.flow += f;
  60. adj[i ^ ].flow -= f;
  61. if(!a) break;
  62. }
  63. }
  64. return flow;
  65. }
  66. L Max_Flow(int S, int T){
  67. this -> S = S;
  68. this -> T = T;
  69. L flow = ;
  70. while(BFS()){
  71. for(int i = ; i < n; i ++) cur[i] = fch[i];
  72. flow += DFS(S, INF);
  73. }
  74. return flow;
  75. }
  76. }sol;
  77. void read(int &x){
  78. x = ; int sig = ; char ch = getchar();
  79. while(!isdigit(ch)) { if(ch == '-') sig = -; ch = getchar(); }
  80. while(isdigit(ch)) x = * x + ch - '', ch = getchar();
  81. x *= sig; return ;
  82. }
  83. void init(){
  84. read(n); read(m);
  85. sol.init(n);
  86. int u, v, w;
  87. for(int i = ; i < m; i++){
  88. read(u); read(v); read(w);
  89. sol.AddEdge(u, v, w);
  90. }
  91. return ;
  92. }
  93. void work(){
  94. ans = sol.Max_Flow(, n);
  95. return ;
  96. }
  97. void print(){
  98. printf("%lld\n", ans);
  99. return ;
  100. }
  101. int main(){
  102. init();
  103. work();
  104. print();
  105. return ;
  106. }

最大流Dinic的更多相关文章

  1. 网络流之最大流Dinic算法模版

    /* 网络流之最大流Dinic算法模版 */ #include <cstring> #include <cstdio> #include <queue> using ...

  2. poj-1459-最大流dinic+链式前向星-isap+bfs+stack

    title: poj-1459-最大流dinic+链式前向星-isap+bfs+stack date: 2018-11-22 20:57:54 tags: acm 刷题 categories: ACM ...

  3. 网络流之最大流Dinic --- poj 1459

    题目链接 Description A power network consists of nodes (power stations, consumers and dispatchers) conne ...

  4. 网络最大流Dinic

    1.什么是网络最大流 形象的来说,网络最大流其实就是这样一个生活化的问题:现在有一个由许多水管组成的水流系统,每一根管道都有自己的最大通过水流限制(流量),超过这个限制水管会爆(你麻麻就会来找你喝茶q ...

  5. HDU 3572 Task Schedule(拆点+最大流dinic)

    Task Schedule Time Limit: 2000/1000 MS (Java/Others)    Memory Limit: 65536/32768 K (Java/Others) To ...

  6. 学习笔记 --- 最大流Dinic算法

    为与机房各位神犇同步,学习下网络流,百度一下发现竟然那么多做法,最后在两种算法中抉择,分别是Dinic和ISAP算法,问过 CA爷后得知其实效率上无异,所以决定跟随Charge的步伐学习Dinic,所 ...

  7. Power Network(网络流最大流 & dinic算法 + 优化)

    Power Network Time Limit: 2000MS   Memory Limit: 32768K Total Submissions: 24019   Accepted: 12540 D ...

  8. ZOJ-2364 Data Transmission 分层图阻塞流 Dinic+贪心预流

    题意:给定一个分层图,即只能够在相邻层次之间流动,给定了各个顶点的层次.要求输出一个阻塞流. 分析:该题直接Dinic求最大流TLE了,网上说采用Isap也TLE,而最大流中的最高标号预流推进(HLP ...

  9. POJ2112_Optimal Milking(网洛流最大流Dinic+最短路Flody+二分)

    解题报告 农场有k个挤奶机和c头牛,每头牛到每一台挤奶机距离不一样,每台挤奶机每天最多挤m头牛的奶. 寻找一个方案,安排每头牛到某一挤奶机挤奶,使得c头牛须要走的全部路程中的最大路程的最小值. 要使每 ...

  10. 最大流dinic模板

    循环版,点的编号从0开始: ; ; const int INF = 0x3f3f3f3f; struct Edge { int to, next, cap, flow; }edge[MAXM]; in ...

随机推荐

  1. 卸载Symantec Endpoint Protection, 无需password的卸载方法

    近期一次偶然的机会, 被人装了个Symantec在电脑上, 搞得各种报警, 验证, 烦死. 然后就自然而然的想卸载掉这个该死的杀毒软件, 没想到这个杀毒软件竟然还是个流氓杀毒软件, 卸载还须要pass ...

  2. Monkeyrunner入门示例

    准备工作1.安装Android SDK2.熟悉MonkeyRunner的API(http://article.yeeyan.org/view/37503/164523)3.一部Android手机或模拟 ...

  3. [PWA] 6. Hijacking response

    For example, if the url is not match to any API endpoint, we want to return 404 error message. So fi ...

  4. CSDN Markdown简明教程5-高速上手

    0.文件夹 文件夹 前言 CSDN Markdown特点 CSDN Markdown高速上手 1 使用快捷键 粗体斜体 引用 链接 高亮代码块 图片 标题 列表 切割线 撤销反复 2 使用离线写作 3 ...

  5. Android 开源项目android-open-project解析之(三) ScrollView,TimeView,TipView,FlipView

    九.ScrollView Discrollview 支持滚动时Item淡入淡出,平移,缩放效果的ScrollView 项目地址:https://github.com/flavienlaurent/di ...

  6. LTTng调试: 一个系统软件工程师的随手涂鸦

    http://nanxiao.me/install-lttng/ http://packages.efficios.com/ http://lttng.org/ http://lttng.org/do ...

  7. Qt 学习之路 :事件

    事件(event)是由系统或者 Qt 本身在不同的时刻发出的.当用户按下鼠标.敲下键盘,或者是窗口需要重新绘制的时候,都会发出一个相应的事件.一些事件在对用户操作做出响应时发出,如键盘事件等:另一些事 ...

  8. html contenteditable

    contenteditable 是html中的一個屬性,在HTML中,某些元素設置 contenteditable='true'  屬性時可以開啟該元素的編輯模式,contenteditable 可以 ...

  9. sdaf

  10. android strings.xml转义字符, 注意细节解决(转)

    XML转义字符 以下为XML标志符的数字和字符串转义符 "     (" 或 ") '     (' 或 &apos;) &     (& 或 & ...