图论算法 最大流算法和最大匹配算法

合集下载
  1. 1、下载文档前请自行甄别文档内容的完整性,平台不提供额外的编辑、内容补充、找答案等附加服务。
  2. 2、"仅部分预览"的文档,不可在线预览部分如存在完整性等问题,可反馈申请退款(可完整预览的文档不适用该条件!)。
  3. 3、如文档侵犯您的权益,请联系客服反馈,我们会尽快为您处理(人工客服工作时间:9:00-18:30)。

最大流算法

clc,clear,M=1000;

c(1,2)=3;c(1,4)=3;

c(2,3)=1;c(2,4)=20;

c(3,6)=3;

c(4,5)=10;

c(5,1)=4;c(5,3)=2;c(5,6)=13;

n=length(u);

list=[];

maxf=zeros(1:n);maxf(n)=1;

while maxf(n)>0

maxf=zeros(1,n);pred=zeros(1,n);

list=1;record=list;maxf(1)=M;

while (~isempty(list))&(maxf(n)==0)

flag=list(1);list(1)=[];

index1=(find(u(flag,:)~=0));

label1=index1(find(u(flag,index1)...

-f(flag,index1)~=0));

label1=setdiff(label1,record);

list=union(list,label1);

pred(label1(find(pred(label1)==0)))=flag;

maxf(label1)=min(maxf(flag),u(flag,label1)... -f(flag,label1));

record=union(record,label1);

label2=find(f(:,flag)~=0);

label2=label2';

label2=setdiff(label2,record);

list=union(list,label2);

pred(label2(find(pred(label2)==0)))=-flag;

maxf(label2)=min(maxf(flag),f(label2,flag)); record=union(record,label2);

end

if maxf(n)>0

v2=n;

v1=pred(v2);

while v2~=1

if v1>0

f(v1,v2)=f(v1,v2)+maxf(n);

else

v1=abs(v1);

f(v2,v1)=f(v2,v1)-maxf(n);

end

v2=v1;

v1=pred(v2);

end

end

end

f

function [f,wf,No]=MaxFlowMinCut_Me(n,C)

% 利用Ford--Fulkerson 标号法求最大流算法的MATLAB 程序代码

% f %显示最大流

% wf %显示最大流量

% No %显示标号, 由此可得最小割

% n 节点个数

% C %弧容量

最大流算法

for(i=1:n)for(j=1:n)f(i,j)=0;end;end%取初始可行流f 为零流

for(i=1:n)No(i)=0;d(i)=0;end%No,d 记录标号

while(1)

No(1)=n+1;d(1)=Inf; %给发点vs 标号

while(1)pd=1; %标号过程

for(i=1:n)if(No(i)) %选择一个已标号的点vi

for(j=1:n)if(No(j)==0&f(i,j)

No(j)=i;d(j)=C(i,j)-f(i,j);pd=0;

if(d(j)>d(i))d(j)=d(i);end

elseif(No(j)==0&f(j,i)>0) %对于未给标号的点vj, 当vjvi 为非零流弧时

No(j)=-i;d(j)=f(j,i);pd=0;

if(d(j)>d(i))d(j)=d(i);end;end;end;end;end

if(No(n)|pd)break;end;end%若收点vt 得到标号或者无法标号,终止标号过程

if(pd)break;end%vt 未得到标号, f 已是最大流, 算法终止

dvt=d(n);t=n; %进入调整过程, dvt 表示调整量

while(1)

if(No(t)>0)f(No(t),t)=f(No(t),t)+dvt; %前向弧调整

elseif(No(t)<0)f(No(t),t)=f(No(t),t)-dvt;end%后向弧调整

if(No(t)==1)for(i=1:n)No(i)=0;d(i)=0; end;break;end%当t 的标号为vs 时, 终止调整过程

t=No(t);end;end; %继续调整前一段弧上的流f

wf=0;for(j=1:n)wf=wf+f(1,j);end

end

n=6;

C=[0 3 0 3 0 0

0 0 1 20 0 0

0 0 0 0 0 3

0 0 0 0 10 0

0 4 2 0 0 13

0 0 0 0 0 0];

[f,wf,No]=MaxFlowMinCut_Me(n,C)

最大匹配算法

A=[1 1 0 1 0

0 1 1 1 0

1 0 1 0 1

0 1 1 0 0

0 0 0 1 1];

A=[1 0 0 1 0

0 1 1 1 0

0 0 0 1 1

1 1 0 0 1

相关文档
最新文档