1 / 3
文档名称:

sap算法.pdf

格式:pdf   大小:213KB   页数:3页
下载后只包含 1 个 PDF 格式的文档,没有任何的图纸或源代码,查看文件列表

如果您已付费下载过本站文档,您可以点这里二次下载

分享

预览

sap算法.pdf

上传人:文库旗舰店 2022/4/24 文件大小:213 KB

下载得到文件列表

sap算法.pdf

文档介绍

文档介绍:SAP 算法
关于网络流的定义之类可以到 nocow 寻找,这里不在阐述。

SAP 算法(by dd_engi):求最大流有一种经典的算法,就是每次找增广路时用 在常数上有所优化的写法是改变距离标号时把当前弧设为那条提供了最小标号的弧。当
前弧的写法之所以正确就在于任何时候我们都能保证在邻接表中当前弧的前面肯定不存在
允许弧。
还有一个常数优化是在每次找到路径并增广完毕之后不要将路径中所有的顶点退栈,而是只
将瓶颈边以及之后的边退栈,这是借鉴了 Dinic 算法的思想。注意任何时候待增广的“当前
点”都应该是栈顶的点的终点。这的确只是一个常数优化,由于当前边结构的存在,我们肯
定可以在 O(n)的时间内复原路径中瓶颈边之前的所有边。


代码:
var
flag:boolean;
jl,min,flow,aug,j,m,n,tmp,a,b,c,i:longint;
his,pre,dis,vh,di:array[0..1024] of longint;
map:array[1..1024,1..1024] of longint;

begin
assign(input,'');reset(input);
assign(output,'');rewrite(output);
readln(m,n);
for i:=1 to m dobegin
readln(a,b,c);
inc(map[a,b],c);
end;
vh[0]:=n;
for i:=1 to n do di[i]:=1;{当前弧初始为第一条弧}
i:=1;{从 S 开始搜}
aug:=maxlongint;
while dis[1]<n do
begin
his[i]:=aug;{标记,以便以后返回这个值}
flag:=false;{这个是是否有找到允许弧的标志}
for j:=di[i] to n do{从当前弧开始搜}
begin
if (map[i,j]>0)and(dis[j]+1=dis[i]) then{找到允许弧}
begin
flag:=true;
di[i]:=j;{标记当前弧}
if map[i,j]<aug then aug:=map[i,j];
pre[j]:=i;{记录前驱}
i:=j;
if i=n then{找到增广路}
begin
inc(flow,aug);
while i<>1 do
begin
tmp:=i;
i:=pre[i];
dec(map[i,tmp],aug);