网络流之 最短增广路算法模板(SAP)
数据输入格式:首先输入顶点个数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)相关推荐
- 网络流—Edmonds-Karp 最短增广路算法(最大流)
网络流----Edmonds-Karp 最短增广路算法 ■求最大流的过程,就是不断找到一条源到汇的路径,然后构建残余网络,再在残余网络上寻找新的路径,使总流量增加,然后形成新的残余网络,再寻找新路径- ...
- 网络流 之 一般增广路算法 标号法实现
数据输入格式:首先输入顶点个数n和弧数m,然后输入每条弧的数据.规定源点为顶点0,汇点为顶点n-1.每条弧的数据格式为:u,v,c,f,分别表示这条弧的起点,终点,容量和流量.顶点序号从0开始. 代码 ...
- 最短增广路Isap算法 网络流
最短增广路 请先理解 bfs的求增广路的算法,再来学习Isap算法 最短增广路Isap算法 图片来源 <趣学算法>人民邮电出版社 陈小玉 /* 最短可增广路:重贴标签算法Isap 算法设计 ...
- 网络最大流中一般增广路算法(标号法)
网络最大流主要有两大类求解方法:增广路算法和预流推进算法 一般增广路算法:主要分为初始流为零流和初始流为非零流的情况!后者在标号的时候注意一条边是正向连接还是反向连接:若是反向的连接,那么在调整的时候 ...
- Sweet Snippet 之 最短增广路径算法
本文简单实现了最短增广路径算法 首先我们简单实现 queue(队列) 数据结构 : local queue = {} queue.__index = queuefunction queue:push( ...
- 增广路算法 (最大流问题)
Edmonds-Karp算法: 计算机科学中, Edmonds–Karp算法通过实现Ford–Fulkerson算法来计算网络中的最大流,其时间复杂度为O(V E2). 该算法由Yefim (Chai ...
- SAP和ISAP(网路最大流的两个增广路算法)
ISAP是对SAP进行优化后的算法,ISAP时间复杂度为O(V^2E),SAP的时间复杂度为O(VE^2) SAP #include <iostream> #include <alg ...
- 【网络流】解题报告:luogu P2740 [USACO4.2]草地排水Drainage Ditches(Edmonds-Karp增广路,最大流模板)
题目链接:草地排水 若一条从源点到汇点的路径上各条边的剩余容量都大于0,则称这条路径为一条增广路. Edmonds-Karp增广路的策略就是不断用bfs寻找增广路,直至网络中不在存在增广路为止. 在每 ...
- 网络流 增广路 回退
增广路: 有流量标记: 流量变化: 转载于:https://www.cnblogs.com/cmyg/p/9568904.html
最新文章
- 计算机网络按定义分,计算机网络定义及其分类
- c++算术溢出_二进制安全之堆溢出(系列)——CTF环境配置
- mybatis报错Type interface xxx.Dao is not known to the MapperRegistry
- hashtable遍历
- 动态注册广播接收者,屏幕锁定Android
- SLAM_2021_F-LOAM:基于激光雷达的快速里程计和建图
- 翻译:吴恩达开启我在AI工作中的新篇章
- nacos启动报错 db.num is null【已解决】
- 【在大学的快乐生活】锐捷校园网无感认证通过路由器mac地址克隆实现一账号多终端
- 虚拟化试题1-网络和存储
- 2021-03-12 16个车辆信息检测数据集收集汇总
- 计算机中有哪些令人拍案叫绝的设计?
- 华为手机所有图标变黑_华为手机app图标变成黑色
- CentOS8.4搭建PXE启动Ubuntu-server20.04(UEFI)
- 工业循环水过滤浅层介质过滤器(浅层砂过滤器)介绍
- IT行业岗位薪资大调查:收入最高的职位是什么?
- 股票的内外盘(转贴收藏)
- tom猫变声原理解析
- 人脸识别特征脸提取PCA算法
- 2020华为校招软件测试:专业面试两轮的算法题
热门文章
- [原创]什么是CMM?
- DeepEarth中的拖放行为(DragBehavior)
- 【Android 事件分发】事件分发源码分析 ( ViewGroup 事件传递机制 七 )
- 【Android 安装包优化】Android 中使用 7zr 可执行程序 压缩文件
- 【Netty】IO 模型简介 ( Netty 特点 | Netty 应用场景 | Java 三种 IO 模型 | BIO 模型 )
- 【设计模式】装饰者模式 ( 概念 | 适用场景 | 优缺点 | 与继承对比 | 定义流程 | 运行机制 | 案例分析 )
- 【Android FFMPEG 开发】FFMPEG ANativeWindow 原生绘制 ( Java 层获取 Surface | 传递画布到本地 | 创建 ANativeWindow )
- 作为面试官的一点小感想
- codeblock 恢复默认字体设置
- 小程序---canvas画图,生成分享图片,画图文字换行