求最大流标号法的描述

合集下载
  1. 1、下载文档前请自行甄别文档内容的完整性,平台不提供额外的编辑、内容补充、找答案等附加服务。
  2. 2、"仅部分预览"的文档,不可在线预览部分如存在完整性等问题,可反馈申请退款(可完整预览的文档不适用该条件!)。
  3. 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

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

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.

相关文档
最新文档