资源简介
利用Ford--Fulkerson 标号法求最大流算法的MATLAB 程序代码
代码片段和文件信息
function [fwfNo]=MaxFlowMinCut_Me(nC)
% 利用Ford--Fulkerson 标号法求最大流算法的MATLAB 程序代码
% f %显示最大流
% wf %显示最大流量
% No %显示标号 由此可得最小割
% n 节点个数
% C %弧容量
% Example:
% n=8;
C=[0 5 4 3 0 0 0 0
0 0 0 0 5 3 0 0
0 0 0 0 0 3 2 0
0 0 0 0 0 0 2 0
0 0 0 0 0 0 0 4
0 0 0 0 0 0 0 3
0 0 0 0 0 0 0 5
0 0 0 0 0 0 0 0];
% [fwfNo]=MaxFlowMinCut_Me(nC)
for(i=1:n)for(j=1:n)f(ij)=0;
end;
end %取初始可行流f 为零流
for(i=1:n)No(i)=0;
d(i)=0;
end %Nod 记录标号
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(ij) No(j)=i;
d(j)=C(ij)-f(ij);
pd=0;
if(d(j)>d(i))d(j)=d(i);
end
elseif(No(j)==0&f(ji)>0) %对于未给标号的点vj 当vjvi 为非零流弧时
No(j)=-i;
d(j)=f(ji);
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(1j);
end
end
属性 大小 日期 时间 名称
----------- --------- ---------- ----- ----
文件 1573 2013-08-01 10:46 MaxFlowMinCut_Me.m
- 上一篇:hdb3编译码 matlab
- 下一篇:梯度校正参数辨识程序
评论
共有 条评论