求最大流标号法的描述
- 1、下载文档前请自行甄别文档内容的完整性,平台不提供额外的编辑、内容补充、找答案等附加服务。
- 2、"仅部分预览"的文档,不可在线预览部分如存在完整性等问题,可反馈申请退款(可完整预览的文档不适用该条件!)。
- 3、如文档侵犯您的权益,请联系客服反馈,我们会尽快为您处理(人工客服工作时间:9:00-18:30)。
求最大流标号法的描述
⑴数据结构
Const maxn=<网络顶点数>
Type node=record {可增广道路的顶点类型}
l,p:integer;{第一标号,检查标号}
end;
arc=record {网络边类型}
c,f:integer; {容量,流量}
end;
gtype=array[0..maxn,0..maxn] of arc;{网矩阵}
ltype=array[0..maxn] of node; {可增广道路}
var lt:ltype; {可增广道路}
g:gtype; {网络}
n,s,t:integer; {顶点数,源点,汇点}
⑵主要算法
①初始化网络,可增广道路
procedure read-graph;
var I,j:integer;
begin
readln(n); {顶点数}
fillchar(g,sizeof(g),0); {初始化网络}
fillchar(lt,sizeof(lt),0); {初始化可增广道路}
for i:=1 to n do
for j:=1 to n do
read(g[I,j].c);
end;
②寻找已标号而来检查的顶点序号
function check:integer;
var i:integer;
begin
i:=1;
while (i<=n)and not((lt[i].l<>0)and(lt[i].p=0)) do inc(i);
if i>n then check:=0 {顶点不存在}
else check:=i;
end;
③标号过程,并返回是否找到可增广道路及改进量a
function ford(var a:integer):boolean; {无增广道路返回true}
var I,j,m,x:integer;
begin
ford:=true;
fillchar(lt,sizeof(lt),0); {去掉原来的标号}
lt[s].l:=s; {从Vs开始}
repeat
1
i:=check; {寻找一个已标号而未检查的顶点i}
if i=0 then exit; {若该顶点不存在,则退出过程,返回true}
for j:=1 to n do
if (lt[j].l=0)and((g[I,j].c<>0)or(g[j,i].c<>0)
{寻找与Vi相邻且未标号的顶点j}
then begin
if (g[I,j].f if (g[j,i].f>0) then lt[j].l:=-I; end; lt[i].p:=1; {顶点Vi置已检查标志} until (lt[t].l<>0) {直到汇点Vt标号为止} m:=t; a:=maxint; {从Vt倒推,改进量a赋初值} repeat {求a} j:=m; m:=abs(lt[t].l); if lt[j].l<0 then x:=g[j,m].f; if lt[j].l>0 then x:=g[m,j].c-g[m,j].f; if a>x then a:=x; until m=s; {直至例推到顶点Vs为止} ford:=false; {返回可增广道路存在标志false} end; ④修正流量 procedure fulkerson(a:integer); var m,j:integer; begin m:=t; {以顶点Vt出发,逆向沿可增广道路修正容量} repeat j:=m; m:=abs(lt[j].l); if lt[j].l<0 then g[j,m].f:=g[j,m].f-a; {后向边p-} if lt[j].l>0 then g[m,j].f:=g[m,j].f+a; {前向边p+} until m=s; end; ⑤输出所有弧的流量 procedure answer; var I,j:integer; begin for i:=1 to n do for j:=1 to n do writeln(‘(’,I, ‘,’,j, ‘)’, ‘ ’,g[I,j].f) end; ⑥算法合成 procedure proceed; {求最大流} var d:integer; success:boolean; begin 2 s:=1; t:=n; {假设源点为V1,汇点为Vn} repeat success:=ford(d); {寻找可增广道路及改进量d} if success then answer {增广道路不存在,输出最大流} else fulkerson(d) {沿增广道路修正流量} until success; end; ⑦主程序 begin read_graph; {输入网} proceed; {求最大流} end. 3