查看: 2219|回复: 2|关注: 0

[已答复] 用matlab实现Ford-Fulkerson算法,提示错误

[复制链接]

新手

15 麦片

财富积分


050


1

主题

1

帖子

0

最佳答案
发表于 2015-3-31 15:52:00 | 显示全部楼层 |阅读模式
function [f,wf,No] = fofuf(C,f1)
% 利用Ford--Fulkerson 标号法求最大流算法的MATLAB 程序代码
% f %显示最大流
% wf %显示最大流量
% No %显示标号, 由此可得最小割
% n 节点个数
% C %弧容量
n = length(C);
if nargin==1;
    f=zeros(n,n);
else
    f=f1;
end
No=zeros(1,n);
d=zeros(1,n);

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)<C(i,j))%对于未标号的点vj,当vivj为非饱和弧时
                        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)
                         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)==0)
             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                                      %计算最大电流量
f;     %显示最大流
wf;    %显示最大流量
No;    %显示标号,由此可得最小割


提示错误是:
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];

  [q,w,e]=fofuf(C)
试图访问 f(9,1);由于 size(f)=[8,8],索引超出范围。

出错 fofuf (line 53)
             f(No(t),t)=f(No(t),t)+dvt;  %向前弧调整



新手

5 麦片

财富积分


050


0

主题

1

帖子

0

最佳答案
发表于 2019-6-20 19:09:22 | 显示全部楼层
倒数第16行 if(No(t)==0) 这个地方出错了哦,改为 if(No(t)==1);要不输出不出来。

新手

5 麦片

财富积分


050


0

主题

2

帖子

0

最佳答案
发表于 3 天前 | 显示全部楼层
请问楼主f1表示什么
您需要登录后才可以回帖 登录 | 注册

本版积分规则

关闭

站长推荐上一条 /4 下一条

快速回复 返回顶部 返回列表