最大流matlab代码,matlab求最大流问题

如下图,我的代码只能求指定两点的最大流,例如V1到V6,列出邻接矩阵C=[0 1 0 1 0 0,1 0 1 0 1 0,0 1 0 1 0 1,1 0 1 0 1 0,0 1 0 1 0 1,0 0 1 0 1 0];带入求解即可,但是若想求V2到V6的最大流,还得重新列矩阵输入很麻烦,求大神改进程序代码,可以通过一组矩阵求任意两点的最大流。

代码 ford-fulkerson标号算法

function [f,wf,No]=maxflow(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

无标题.png

(50.75 KB, 下载次数: 3)

2013-5-10 11:15 上传

442a53943febe9465fc072b4fbe10813.gif

b2a5a3e0dcc7d508e00275fe42fce1b5.gif

5d1e9ba325d3d26a725773aacfb30a51.png

  • 0
    点赞
  • 11
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值