不说别的,直接上模板。

Dinic+当前弧优化:

  1. struct Edge{
  2. int x,y,c,ne;
  3. }e[M*];
  4. int be[N],all;
  5. int d[N],q[N];
  6. int stack[N],top;//栈存的是边
  7. int cur[N];//当前弧优化
  8. void add(int x, int y, int z)//需保证相反边第一个为偶数
  9. {
  10. e[all].x=x; e[all].y=y; e[all].c=z;
  11. e[all].ne=be[x];
  12. be[x]=all++;
  13. e[all].x=y; e[all].y=x; e[all].c=;
  14. e[all].ne=be[y];
  15. be[y]=all++;
  16. }
  17. bool BFS(int s, int t)//化为层次图 使得边数从m降低为n 复杂度随之下降
  18. {
  19. memset(d,-,sizeof(d));
  20. int head=,tail=;
  21. q[++tail]=s;
  22. d[s]=;
  23. while(head!=tail)
  24. {
  25. int u=q[++head];
  26. for(int i=be[u]; i!=-; i=e[i].ne)
  27. if(e[i].c> && d[e[i].y]==-){
  28. d[e[i].y]=d[u]+;
  29. q[++tail]=e[i].y;
  30. if(tail==N-) tail=;
  31. if(e[i].y==t) return ;
  32. }
  33. }
  34. return ;
  35. }
  36.  
  37. int Dinic(int s, int t)//防止爆栈 用stack模拟递归
  38. {
  39. int ans=;
  40. while(BFS(s,t))
  41. {
  42. memcpy(cur,be,sizeof(be));
  43. int u=s;
  44. top=;//dfs开始 清空栈
  45. while()
  46. {
  47. if(u==t)
  48. {
  49. int minc=,mini;
  50. for(int i=; i<top; i++)
  51. if(minc>e[stack[i]].c)
  52. {
  53. minc=e[stack[i]].c;
  54. mini=i;//以便之后回到这继续增广
  55. }
  56. for(int i=; i<top; i++)
  57. {
  58. e[stack[i]].c-=minc;
  59. e[stack[i]^].c+=minc;//第一个二进制取反 即取相反边
  60. }
  61. ans+=minc;
  62. top=mini;
  63. u=e[stack[mini]].x;
  64. }
  65. for(int i=cur[u]; i!=-; cur[u]=i=e[cur[u]].ne)
  66. if(e[i].c> && d[e[i].y]==d[e[i].x]+) break;
  67. if(cur[u]!=-)
  68. {
  69. stack[top++]=cur[u];
  70. u=e[cur[u]].y;
  71. }else
  72. {
  73. if(top==) break; //循环结束标志
  74. d[u]=-;//当前节点不在增广路中 删除
  75. u=e[stack[--top]].x;//回溯
  76. }
  77. }
  78. }
  79. return ans;
  80. }

ISAP+GAP+当前弧优化:

  1. struct Edge{
  2. int x,y,c,ne;
  3. }e[M*];
  4. int x,y,z,n,m,s,t;
  5. int be[N],all;
  6. int d[N],q[N];
  7. int stack[N];//模拟递归
  8. int gap[N],cur[N];//gap优化+当前弧优化
  9.  
  10. void add(int x, int y, int z)//保证第一个为偶数
  11. {
  12. e[all].x=x; e[all].y=y; e[all].c=z;
  13. e[all].ne=be[x];
  14. be[x]=all++;
  15. e[all].x=y; e[all].y=x; e[all].c=;
  16. e[all].ne=be[y];
  17. be[y]=all++;
  18. }
  19.  
  20. void BFS(int s, int t)
  21. {
  22. memset(d,-,sizeof(d));
  23. memset(gap,,sizeof(gap));
  24. gap[]=;
  25. int head=,tail=;
  26. q[++tail]=t;
  27. d[t]=;
  28. while(head!=tail)
  29. {
  30. int u=q[++head];
  31. for(int i=be[u]; i!=-; i=e[i].ne)
  32. if(d[e[i].y]==-)
  33. {
  34. d[e[i].y]=d[u]+;
  35. q[++tail]=e[i].y;
  36. gap[d[e[i].y]]++;
  37. }
  38. }
  39. }
  40.  
  41. int sap(int s, int t, int n)
  42. {
  43. int ans=;
  44. BFS(s,t);
  45. memcpy(cur,be,sizeof(be));
  46. int top=;
  47. int u=s;
  48. while(d[s]<n)
  49. {
  50. if(u==t)
  51. {
  52. int minc=,mini;
  53. for(int i=; i<top; i++)
  54. if(minc>e[stack[i]].c)
  55. {
  56. minc=e[stack[i]].c;
  57. mini=i;
  58. }
  59. for(int i=; i<top; i++)
  60. {
  61. e[stack[i]].c-=minc;
  62. e[stack[i]^].c+=minc;
  63. }
  64. ans+=minc;
  65. top=mini;
  66. u=e[stack[mini]].x;
  67. continue;
  68. }
  69. for(int i=cur[u]; i!=-; cur[u]=i=e[i].ne)//当前弧优化
  70. if(e[i].c> && d[e[i].y]+==d[u]) break;
  71. if(cur[u]!=-)
  72. {
  73. stack[top++]=cur[u];
  74. u=e[cur[u]].y;
  75. }else
  76. {
  77. int mind=n;
  78. for(int i=be[u]; i!=-; i=e[i].ne)//更新距离标号
  79. if(e[i].c> && mind>d[e[i].y])
  80. {
  81. mind=d[e[i].y];
  82. cur[u]=i;
  83. }
  84. gap[d[u]]--;
  85. if(!gap[d[u]]) return ans;//gap表示当前距离的点有多少个 一旦==0 说明断层直接退出循环
  86. d[u]=mind+;
  87. gap[d[u]]++;
  88. if(u!=s) u=e[stack[--top]].x;
  89. }
  90. }
  91. return ans;
  92. }
  93.  
  94. void init()
  95. {
  96. all=;
  97. memset(be,-,sizeof(be));
  98. }

最大流 Dinic + Sap 模板的更多相关文章

  1. POJ 3469.Dual Core CPU 最大流dinic算法模板

    Dual Core CPU Time Limit: 15000MS   Memory Limit: 131072K Total Submissions: 24830   Accepted: 10756 ...

  2. (网络流 最大流 Dinic || SAP)Control -- hdu --4289

    链接: http://acm.hdu.edu.cn/showproblem.php?pid=4289 http://acm.hust.edu.cn/vjudge/contest/view.action ...

  3. 求最大流dinic算法模板

    //最短增广路,Dinic算法 struct Edge { int from,to,cap,flow; };//弧度 void AddEdge(int from,int to,int cap) //增 ...

  4. poj 1273最大流dinic算法模板

    #include<stdio.h> #include<string.h> #define N 300 #define inf 0x7fffffff #include<qu ...

  5. 最大流Dinic(模板)

    #define IOS ios_base::sync_with_stdio(0); cin.tie(0); #include <cstdio>//sprintf islower isupp ...

  6. 最大流Dinic算法模板(pascal)

    program rrr(input,output); const inf=; type pointer=^nodetype; nodetype=record t,c:longint; next,rev ...

  7. HDU1532最大流 Edmonds-Karp,Dinic算法 模板

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

  8. hdu 4280 最大流 sap模板

    给你岛的坐标求最西边到最东边的最大流 /* 最大流模板 sap */ #include<stdio.h> #include<string.h> #include<algo ...

  9. POJ 1815 - Friendship - [拆点最大流求最小点割集][暴力枚举求升序割点] - [Dinic算法模板 - 邻接矩阵型]

    妖怪题目,做到现在:2017/8/19 - 1:41…… 不过想想还是值得的,至少邻接矩阵型的Dinic算法模板get√ 题目链接:http://poj.org/problem?id=1815 Tim ...

随机推荐

  1. C# - (0x80040154): Retrieving the COM class factory for component with CLSID {877AA945-1CB2-411C-ACD7-C70B1F9E2E32} failed

    1. Exeption Error: System.Runtime.InteropServices.COMException (0x80040154): Retrieving the COM clas ...

  2. CSS3展现精彩的动画效果 css3的动画属性

    热火朝天的css3无疑吸引了很多前端开发者的眼球,然而在css3中的动画属性则是新功能中的主打招牌,说到css3的动画属性不得不让人想起这三个属性:Transform﹑Transition﹑Anima ...

  3. 30个实用的Linux find命令示例

    除了在一个目录结构下查找文件这种基本的操作,你还可以用find命令实现一些实用的操作,使你的命令行之旅更加简易. 本文将介绍15种无论是于新手还是老鸟都非常有用的Linux find命令. 首先,在你 ...

  4. ELF

    http://www.360doc.com/content/11/0826/13/7588214_143424472.shtml 链接,装载都是基于数据结构ELF.

  5. PAT-乙级-1050. 螺旋矩阵(25)

    1050. 螺旋矩阵(25) 时间限制 150 ms 内存限制 65536 kB 代码长度限制 8000 B 判题程序 Standard 作者 CHEN, Yue 本题要求将给定的N个正整数按非递增的 ...

  6. OpenLDAP配置信息记录

    随着各种研发工具使用越来越多,单独为每个工具维护一个账号系统的开销越来越大,而且作为用户多个账号密码使用也越来越不方便.所以需要做一个统一账号登陆. 查询了多个方法,又因为之前用过LDAP,所以选择了 ...

  7. $('li','div') $('div li') $('div li')

    $('div','li')是$(子,父),是从父节点里找子,而不是找li外面的div $('div , li')才是找所有的div和li,之间不存在父子关系 $('div li') 是找div里面所有 ...

  8. Capsule:开源的 JVM 应用部署工具

    [编者按]本文作者 Ron Pressler 是 Parallel Universe 公司的创始人,拥有着丰富的高性能开发经验.通过这篇文章,Ron 向大家详细介绍了全新的开源 JVM 部署工具--C ...

  9. Chp5: Bit Manipulation

    Bits Facts and Tricks x ^ 0s =  x x & 0s =  0 x | 0s = x x ^ 1s = ~x x & 1s = x x | 1s = 1s ...

  10. Public, Private and Protect

    public 意味着在其后声明的所有成员对所有的人都可以取. private 意味着除了该类型的创建者和类的内部成员函数之外,任何人都不能存取这些成员. protect 它与private基本相似,只 ...