算法模板——sap网络最大流 2(非递归+邻接表)
时间:2022-05-07
本文章向大家介绍算法模板——sap网络最大流 2(非递归+邻接表),主要内容包括其使用实例、应用技巧、基本知识点总结和需要注意事项,具有一定的参考价值,需要的朋友可以参考一下。
实现功能:同最大流 1
这里面主要是把前面的邻接矩阵改成了邻接表,相比之下速度大大提高——本人实测,当M=1000000 N=10000 时,暂且不考虑邻接矩阵会不会MLE,新的程序速度快了很多倍(我们家这个很弱的电脑上耗时0.3s);而当M=300000 N=10000时,优势更加明显(几乎是秒出),别的没了,尤其当遇到稀疏图的时候这样子是大大划算的!!!
1 type
2 point=^node;
3 node=record
4 g,w:longint;
5 next:point;
6 end;
7
8 var
9 i,j,k,l,m,n,tmp,ans,aug,mi,s,t:longint;
10 di,a:array[0..10005] of point;
11 pre,his,dis,vh:array[0..10005] of longint;
12 flag:boolean;p,jl:point;
13 function min(x,y:longint):longint;inline;
14 begin
15 if x<y then min:=x else min:=y;
16 end;
17 function add(x,y,z:longint):longint;inline;
18 var p:point;
19 begin
20 new(p);p^.w:=z;p^.g:=y;
21 p^.next:=a[x];a[x]:=p;
22 end;
23 procedure op(x,y,z:longint);inline;
24 var p:point;
25 begin
26 p:=a[x];
27 while p<>nil do
28 begin
29 if (p^.g=y) and ((p^.w+z)>=0) then
30 begin
31 p^.w:=p^.w+z;
32 break;
33 end;
34 p:=p^.next;
35 end;
36 end;
37 begin
38 readln(n,m,s,t);
39 for i:=1 to n do a[i]:=nil;
40 for i:=1 to m do
41 begin
42 readln(j,k,l);
43 add(j,k,l);add(k,j,0);
44 end;
45 for i:=1 to n do di[i]:=a[i];
46 fillchar(dis,sizeof(dis),0);
47 fillchar(pre,sizeof(pre),0);
48 fillchar(his,sizeof(his),0);
49 fillchar(vh,sizeof(vh),0);
50 i:=s;vh[0]:=n;ans:=0;aug:=maxlongint;
51 while dis[s]<n do
52 begin
53 flag:=false;his[i]:=aug;
54 p:=a[i];
55 while p<>nil do
56 begin
57 if (p^.w>0) and (dis[i]=(dis[p^.g]+1)) then
58 begin
59 aug:=min(aug,p^.w);
60 pre[p^.g]:=i;di[i]:=p;
61 flag:=true;i:=p^.g;
62 if i=t then
63 begin
64 ans:=ans+aug;
65 while i<>s do
66 begin
67 tmp:=i;
68 i:=pre[i];
69 op(i,tmp,-aug);
70 op(tmp,i,aug);
71 end;
72 aug:=maxlongint;
73 end;
74 break;
75 end;
76 p:=p^.next;
77 end;
78 if flag then continue;
79 jl:=nil;mi:=n-1;
80 p:=a[i];
81 while p<>nil do
82 begin
83 if (p^.w>0) and (dis[p^.g]<mi) then
84 begin
85 jl:=p;mi:=dis[p^.g];
86 end;
87 p:=p^.next;
88 end;
89 di[i]:=jl;
90 dec(vh[dis[i]]);
91 if vh[dis[i]]=0 then break;
92 dis[i]:=mi+1;
93 inc(vh[dis[i]]);
94 if i<>s then
95 begin
96 i:=pre[i];
97 aug:=his[i];
98 end;
99 end;
100 writeln(ans);
101 end.
102
- 使用VS Code开发asp.net core
- 以太坊·将自定义数据写入到区块链中
- 使用TensorFlow实现股票价格预测深度学习模型
- 06-移动端开发教程-fullpage框架
- 07-移动端开发教程-移动端视口
- 10-移动端开发教程-移动端事件
- 08-移动端开发教程-移动端适配方案
- 09-移动端开发教程-Sass入门
- 开发者的如何优雅的使用OSX
- Solidity 智能合约开发语言·数据类型
- 以太坊·Rinkeby 测试网络
- TensorFlow强化学习入门(0)——Q-Learning的查找表实现和神经网络实现
- 【云端架构】网站运维之CDN链接鉴权示例入门(PHP)
- 以太坊·单机多实例演示
- JavaScript 教程
- JavaScript 编辑工具
- JavaScript 与HTML
- JavaScript 与Java
- JavaScript 数据结构
- JavaScript 基本数据类型
- JavaScript 特殊数据类型
- JavaScript 运算符
- JavaScript typeof 运算符
- JavaScript 表达式
- JavaScript 类型转换
- JavaScript 基本语法
- JavaScript 注释
- Javascript 基本处理流程
- Javascript 选择结构
- Javascript if 语句
- Javascript if 语句的嵌套
- Javascript switch 语句
- Javascript 循环结构
- Javascript 循环结构实例
- Javascript 跳转语句
- Javascript 控制语句总结
- Javascript 函数介绍
- Javascript 函数的定义
- Javascript 函数调用
- Javascript 几种特殊的函数
- JavaScript 内置函数简介
- Javascript eval() 函数
- Javascript isFinite() 函数
- Javascript isNaN() 函数
- parseInt() 与 parseFloat()
- escape() 与 unescape()
- Javascript 字符串介绍
- Javascript length属性
- javascript 字符串函数
- Javascript 日期对象简介
- Javascript 日期对象用途
- Date 对象属性和方法
- Javascript 数组是什么
- Javascript 创建数组
- Javascript 数组赋值与取值
- Javascript 数组属性和方法
- 当飞桨PaddleHub遇到微信小程序,AI也能指物作诗
- Android仿QQ好友详情页下拉顶部图片缩放效果
- 数组对象转为Map
- TensorFlow2.X使用图片制作简单的数据集训练模型
- Android高性能日志写入方案的实现
- MySQL 三万字精华总结 + 面试100 问,吊打面试官绰绰有余(收藏系列)
- 想后台运行没想到导致磁盘满了
- 来看一道"简单的"C语言面试题
- 这行代码的打印结果确实让人迷惑!
- 如何实现一个高效的启发式算法?(VRPTW篇)
- Ubuntu Server搭建Hyperledger Fabric 2.1学习环境
- 辛辛苦苦学会的 webpack dll 配置,可能已经过时了
- 【程序中的数学】利用德摩根定律简化布尔运算
- Conjob For hybris
- ListView通用泛型适配器