1. 几个比较好的博客
  2. http://www.renfei.org/blog/isap.html
  3. http://kenby.iteye.com/blog/945454
  4. http://blog.csdn.net/mypsq/article/details/37959249
  1. #include<stdio.h>
  2. #include<string.h>
  3. #include<queue>
  4. using namespace std;
  5. #define inf 999999
  6. #define N 300
  7. struct node {
  8. int u,v,w,next;
  9. }bian[N*N*2];
  10. int head[N],yong,stac[N],top,start,n,cur[N],dis[N],gap[N];
  11. void init() {
  12. memset(head,-1,sizeof(head));
  13. memset(dis,-1,sizeof(dis));
  14. memset(gap,0,sizeof(gap));
  15. memset(cur,0,sizeof(cur));
  16. top=0;start=1;yong=0;
  17. }
  18. void addedge(int u,int v,int w) {/*建边*/
  19. bian[yong].u=u;
  20. bian[yong].v=v;
  21. bian[yong].w=w;
  22. bian[yong].next=head[u];
  23. head[u]=yong++;
  24. }
  25. void bfs() {
  26. queue<int>q;
  27. q.push(n);
  28. dis[n]=0;
  29. int i;
  30. /*建立层次图*/
  31. while(!q.empty()) {
  32. int c=q.front();
  33. q.pop();
  34. for(i=head[c];i!=-1;i=bian[i].next) {
  35. int v=bian[i].v;
  36. if(dis[v]==-1) {//这里注意不能加这个条件(bian[i^1].w)
  37. dis[v]=dis[c]+1;
  38. q.push(v);
  39. }
  40. }
  41. }
  42. }
  43. int ISAP() {
  44. int k,i,sum=0;
  45. bfs();
  46. for(i=1;i<=n;i++)//cur数组记录当前位置的边的坐标
  47. cur[i]=head[i];
  48. for(i=1;i<=n;i++)
  49. gap[dis[i]]++;//gap优化记录到汇点距离为dis[i]的个数
  50. k=start;
  51. while(dis[start]<n) {
  52. if(k==n) {//如果满足条件
  53. int mi=inf,index;
  54. for(i=0;i<top;i++)
  55. if(mi>bian[stac[i]].w) {//找最小流
  56. mi=bian[stac[i]].w;
  57. index=i;
  58. }
  59. for(i=0;i<top;i++) {//修改残留网络
  60. bian[stac[i]].w-=mi;
  61. bian[stac[i]^1].w+=mi;
  62. }
  63. sum+=mi;
  64. top=index;//定位到最小的边的权值的位置
  65. k=bian[stac[top]].u;//当前的k
  66. }
  67. for(i=cur[k];i!=-1;i=bian[i].next) {//遍历未走过的边
  68. int v=bian[i].v;
  69. if(bian[i].w&&dis[k]==dis[v]+1) {//
  70. cur[k]=i;
  71. k=v;
  72. stac[top++]=i;
  73. break;
  74. }
  75. }
  76. if(i==-1) {/*更新*/
  77. int m=n;
  78. for(i=head[k];i!=-1;i=bian[i].next)
  79. if(bian[i].w&&m>dis[bian[i].v]){
  80. m=dis[bian[i].v];
  81. cur[k]=i;//记录当前的边的下标
  82. }
  83. if(--gap[dis[k]]==0)break;//出现断层
  84. dis[k]=m+1;gap[dis[k]]++;
  85. if(k!=start)//如果非源点的话
  86. k=bian[stac[--top]].u;//退点,推到上一个点,将当前边删掉,因为是<top
  87. }
  88. }
  89. return sum;
  90. }
  91. int main() {
  92. int m,i,j,k;
  93. while(scanf("%d%d",&m,&n)!=EOF) {
  94. init();
  95. while(m--) {
  96. scanf("%d%d%d",&i,&j,&k);
  97. addedge(i,j,k);
  98. addedge(j,i,0);
  99. }
  100. printf("%d\n",ISAP());
  101. }
  102. return 0;
  103. }

isap算法模板poj 1273gap+弧优化 最大流的更多相关文章

  1. poj 3469 最小割模板sap+gap+弧优化

    /*以核心1为源点,以核心2为汇点建图,跑一遍最大流*/ #include<stdio.h> #include<string.h> #include<queue> ...

  2. 网络流小记(EK&dinic&当前弧优化&费用流)

    欢 迎 来 到 网 络 瘤 的 世 界 什么是网络流? 现在我们有一座水库,周围有n个村庄,每个村庄都需要水,所以会修水管(每个水管都有一定的容量,流过的水量不能超过容量).最终水一定会流向唯一一个废 ...

  3. ARC085E(最小割规划【最大流】,Dinic当前弧优化)

    #include<bits/stdc++.h>using namespace std;typedef long long ll;const ll inf=0x3f3f3f3f;int cn ...

  4. P3376 【模板】网络最大流( Edmonds-krap、Dinic、ISAP 算法)

    P3376 [模板]网络最大流( Edmonds-krap.Dinic.ISAP 算法) 题目描述 如题,给出一个网络图,以及其源点和汇点,求出其网络最大流. 输入格式 第一行包含四个正整数N.M.S ...

  5. POJ 1273 Drainage Ditches(网络流dinic算法模板)

    POJ 1273给出M条边,N个点,求源点1到汇点N的最大流量. 本文主要就是附上dinic的模板,供以后参考. #include <iostream> #include <stdi ...

  6. 最大流当前弧优化Dinic模板

    最大流模板: 普通最大流 无向图限制:将无向图的边拆成2条方向相反的边 无源汇点有最小流限制的最大流:理解为水管流量形成循环,每根水管有流量限制,并且流入量等于流出量 有源汇点的最小流限制的最大流 顶 ...

  7. 最大流当前弧优化Dinic分层模板

    最大流模板: 普通最大流 无向图限制:将无向图的边拆成2条方向相反的有向边 顶点有流量限制:拆成2个点,连接一条容量为点容量限制的边 无源汇点有最小流限制的最大流:理解为水管流量形成循环 有源汇点的最 ...

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

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

  9. 【最大流之Dinic算法】POJ1273 【 & 当前弧优化 & 】

    总评一句:Dinic算法的基本思想比较好理解,就是它的当前弧优化的思想,网上的资料也不多,所以对于当前弧的优化,我还是费了很大的功夫的,现在也一知半解,索性就写一篇博客,来发现自己哪里的算法思想还没理 ...

随机推荐

  1. RK摄像头移植【转】

    本文转载自:http://wiki.t-firefly.com/index.php/Firefly-RK3288/Camera 板载资源 Firefly-RK3288 开发板带有一个 MIPI 摄像头 ...

  2. RTP协议分析和详解

    一.RTP协议分析 第1章.     RTP概述 1.1.  RTP是什么 RTP全名是Real-time Transport Protocol(实时传输协议).它是IETF提出的一个标准,对应的RF ...

  3. (Go)10.流程控制示例

    package main import ( "math/rand" "fmt" ) func main() { //var n int n := rand.In ...

  4. 0420-mysql命令(数据库操作层级,建表,对表的操作)

    注意事项: 符号必须为英文. 数据库操作层级: 建表大全: #新建表zuoye1:drop table if exists zuoye1;create table zuoye1(    id int ...

  5. 工作2-5年,身为iOS开发的我应该怎么选择进修方向?

    前言: 跳槽,面试,进阶,加薪:这些字眼,相信每位程序员都不陌生! 但是方向的选择,却不知如何抉择!其实最好的方向,已经在各个企业面试需求中完美的体现出来了: 本文展示了2份面试需求,以及方向的总结, ...

  6. 基于移动Web的视图引擎实现

    第一步:移动视图引擎实现 using System.Web.Mvc; /// <summary> /// 移动版View引擎 /// </summary> public cla ...

  7. 可变长度参数列表(Stering...aaa)

  8. sql--Truncate Table

    Truncate Table(截断表) 有时候需要清除一个表中的所有资料.要达到者个目的,一种方式是DROP TABLE 指令.不过这样整个表格就消失,而无法再被用了. 另一种方式是Delete不带w ...

  9. AFN上传多张图片

    AFN上传多张图片代码: AFHTTPSessionManager *sessionManager = [AFHTTPSessionManager manager]; sessionManager.r ...

  10. Android引导页

    源码地址:https://github.com/myloften/IntroSliderSample 博客地址:http://blog.csdn.net/loften_93663469/article ...