数据输入格式:首先输入顶点个数n和弧数m,然后输入每条弧的数据。规定源点为顶点0,汇点为顶点n-1.每条弧的数据格式为:u,v,w,分别表示这条弧的起点,终点,容量。顶点序号从0开始。

代码:

  1 #include <iostream>
  2 #include <cstdio>
  3 #include <cstring>
  4 #include <algorithm>
  5 #include <cmath>
  6 #include <string>
  7 #include <map>
  8 #include <stack>
  9 #include <vector>
 10 #include <set>
 11 #include <queue>
 12 #pragma comment (linker,"/STACK:102400000,102400000")
 13 #define maxn 1005
 14 #define MAXN 2005
 15 #define mod 1000000009
 16 #define INF 0x3f3f3f3f
 17 #define pi acos(-1.0)
 18 #define eps 1e-6
 19 typedef long long ll;
 20 using namespace std;
 21
 22 int d[maxn];    //标号
 23 int mp[maxn][maxn];     //残留网络,初始为原图
 24 int num[maxn];      //num[i]表示标号为i的顶点数有多少
 25 int pre[maxn];      //记录前驱
 26 int n,m,s,t;        //n个顶点,m条边,源点s,汇点t
 27
 28 void init()     //bfs计算标号,汇点t的标号为零
 29 {
 30     int k;
 31     queue<int>Q;
 32     memset(d,INF,sizeof(d));  //初始化d数组为无穷大
 33     memset(num,0,sizeof(num));  //初始化num数组num
 34     Q.push(t);      //汇点t入队列
 35     d[t]=0;     //汇点标号为零
 36     num[0]=1;   //标号为0的顶点数为1
 37     while (!Q.empty())
 38     {
 39         k=Q.front();
 40         Q.pop();
 41         for (int i=0;i<n;i++)
 42         {
 43             if (d[i]>=n&&mp[i][k]>0)
 44             {
 45                 d[i]=d[k]+1;
 46                 Q.push(i);
 47                 num[d[i]]++;
 48             }
 49         }
 50     }
 51 }
 52
 53 int findAlowArc(int i)      //从i出发寻找允许弧
 54 {
 55     int j;
 56     for (j=0;j<n;j++)
 57         if (mp[i][j]>0&&d[i]==d[j]+1)
 58             return j;
 59     return -1;
 60 }
 61
 62 int reLable(int i)      //重新标号
 63 {
 64     int mm=INF;
 65     for (int j=0;j<n;j++)
 66         if (mp[i][j]>0)
 67             mm=min(mm,d[j]+1);
 68     return mm==INF?m:mm;
 69 }
 70
 71 int maxFlow(int s,int t)       //求从源点s出发的最大流
 72 {
 73     int flow=0,i=s,j;
 74     int delta;          //增量
 75     memset(pre,-1,sizeof(pre));
 76     while (d[s]<n)
 77     {
 78         j=findAlowArc(i);
 79         if (j>=0)
 80         {
 81             pre[j]=i;
 82             i=j;
 83             if (i==t)       //更新残留网络
 84             {
 85                 delta=INF;
 86                 for (i=t;i!=s;i=pre[i])
 87                     delta=min(delta,mp[pre[i]][i]);
 88                 for (i=t;i!=s;i=pre[i])
 89                     mp[pre[i]][i]-=delta,mp[i][pre[i]]+=delta;
 90                 flow+=delta;
 91             }
 92         }
 93         else
 94         {
 95             int x=reLable(i);       //重新标号
 96             num[x]++;
 97             num[d[i]]--;
 98             if (num[d[i]]==0)        //间隙优化
 99                 return flow;
100             d[i]=x;
101             if (i!=s)
102                 i=pre[i];
103         }
104     }
105     return flow;
106 }
107
108 int main()
109 {
110     int u,v,c;  //弧的起点,终点,容量
111     while (scanf("%d%d",&n,&m)!=EOF)  //读入顶点个数n和弧数m
112     {
113         memset(mp,0,sizeof(mp));
114         for (int i=0;i<m;i++)
115         {
116             scanf("%d%d%d",&u,&v,&c);
117             mp[u][v]=c;
118         }
119         s=0,t=n-1;
120         init();
121         printf("%d\n",maxFlow(0,n-1));
122     }
123     return 0;
124 }
125 /*
126 6 10
127 0 1 8
128 0 2 4
129 1 3 2
130 1 4 2
131 2 1 4
132 2 3 1
133 2 4 4
134 3 4 6
135 3 5 9
136 4 5 7
137 */

View Code

转载于:https://www.cnblogs.com/i8888/p/4048928.html

网络流之 最短增广路算法模板(SAP)相关推荐

  1. 网络流—Edmonds-Karp 最短增广路算法(最大流)

    网络流----Edmonds-Karp 最短增广路算法 ■求最大流的过程,就是不断找到一条源到汇的路径,然后构建残余网络,再在残余网络上寻找新的路径,使总流量增加,然后形成新的残余网络,再寻找新路径- ...

  2. 网络流 之 一般增广路算法 标号法实现

    数据输入格式:首先输入顶点个数n和弧数m,然后输入每条弧的数据.规定源点为顶点0,汇点为顶点n-1.每条弧的数据格式为:u,v,c,f,分别表示这条弧的起点,终点,容量和流量.顶点序号从0开始. 代码 ...

  3. 最短增广路Isap算法 网络流

    最短增广路 请先理解 bfs的求增广路的算法,再来学习Isap算法 最短增广路Isap算法 图片来源 <趣学算法>人民邮电出版社 陈小玉 /* 最短可增广路:重贴标签算法Isap 算法设计 ...

  4. 网络最大流中一般增广路算法(标号法)

    网络最大流主要有两大类求解方法:增广路算法和预流推进算法 一般增广路算法:主要分为初始流为零流和初始流为非零流的情况!后者在标号的时候注意一条边是正向连接还是反向连接:若是反向的连接,那么在调整的时候 ...

  5. Sweet Snippet 之 最短增广路径算法

    本文简单实现了最短增广路径算法 首先我们简单实现 queue(队列) 数据结构 : local queue = {} queue.__index = queuefunction queue:push( ...

  6. 增广路算法 (最大流问题)

    Edmonds-Karp算法: 计算机科学中, Edmonds–Karp算法通过实现Ford–Fulkerson算法来计算网络中的最大流,其时间复杂度为O(V E2). 该算法由Yefim (Chai ...

  7. SAP和ISAP(网路最大流的两个增广路算法)

    ISAP是对SAP进行优化后的算法,ISAP时间复杂度为O(V^2E),SAP的时间复杂度为O(VE^2) SAP #include <iostream> #include <alg ...

  8. 【网络流】解题报告:luogu P2740 [USACO4.2]草地排水Drainage Ditches(Edmonds-Karp增广路,最大流模板)

    题目链接:草地排水 若一条从源点到汇点的路径上各条边的剩余容量都大于0,则称这条路径为一条增广路. Edmonds-Karp增广路的策略就是不断用bfs寻找增广路,直至网络中不在存在增广路为止. 在每 ...

  9. 网络流 增广路 回退

    增广路: 有流量标记: 流量变化: 转载于:https://www.cnblogs.com/cmyg/p/9568904.html

最新文章

  1. 计算机网络按定义分,计算机网络定义及其分类
  2. c++算术溢出_二进制安全之堆溢出(系列)——CTF环境配置
  3. mybatis报错Type interface xxx.Dao is not known to the MapperRegistry
  4. hashtable遍历
  5. 动态注册广播接收者,屏幕锁定Android
  6. SLAM_2021_F-LOAM:基于激光雷达的快速里程计和建图
  7. 翻译:吴恩达开启我在AI工作中的新篇章
  8. nacos启动报错 db.num is null【已解决】
  9. 【在大学的快乐生活】锐捷校园网无感认证通过路由器mac地址克隆实现一账号多终端
  10. 虚拟化试题1-网络和存储
  11. 2021-03-12 16个车辆信息检测数据集收集汇总
  12. 计算机中有哪些令人拍案叫绝的设计?
  13. 华为手机所有图标变黑_华为手机app图标变成黑色
  14. CentOS8.4搭建PXE启动Ubuntu-server20.04(UEFI)
  15. 工业循环水过滤浅层介质过滤器(浅层砂过滤器)介绍
  16. IT行业岗位薪资大调查:收入最高的职位是什么?
  17. 股票的内外盘(转贴收藏)
  18. tom猫变声原理解析
  19. 人脸识别特征脸提取PCA算法
  20. 2020华为校招软件测试:专业面试两轮的算法题

热门文章

  1. [原创]什么是CMM?
  2. DeepEarth中的拖放行为(DragBehavior)
  3. 【Android 事件分发】事件分发源码分析 ( ViewGroup 事件传递机制 七 )
  4. 【Android 安装包优化】Android 中使用 7zr 可执行程序 压缩文件
  5. 【Netty】IO 模型简介 ( Netty 特点 | Netty 应用场景 | Java 三种 IO 模型 | BIO 模型 )
  6. 【设计模式】装饰者模式 ( 概念 | 适用场景 | 优缺点 | 与继承对比 | 定义流程 | 运行机制 | 案例分析 )
  7. 【Android FFMPEG 开发】FFMPEG ANativeWindow 原生绘制 ( Java 层获取 Surface | 传递画布到本地 | 创建 ANativeWindow )
  8. 作为面试官的一点小感想
  9. codeblock 恢复默认字体设置
  10. 小程序---canvas画图,生成分享图片,画图文字换行