function [M,maxflow]=FoldFulkerson(A)
%输入:A为原图的邻接矩阵
%输出:M为最大流值,maxflow为此时的可行流
%maxflow从零流开始慢慢增广,A是残量网络
m=size(A,1);%压缩表中最大值就是邻接矩阵的宽与高
maxflow=zeros(m,m);
while 1 %下面用广度优先搜索找增广路径
flag=[];%相当于closed表,已访问过的节点不再访问
flag=[flag 1];%访问一个增加一个在该标志中
head=1;%判断是不是tail的后继节点
tail=1;%第一个节点,判断是谁的前趋
queue=[];%队列,相当于open表,将要访问的节点
queue(head)=1;
head=head+1;
pa=zeros(1,m); %每个节点的前趋
pa(1)=1; %源节点前趋是自己
while tail~=head %广度优先搜索,判断是否每一个节点的前趋都已经找到
i=queue(tail);
for j=1:m
if A(i,j)>0 && isempty(find(flag==j,1))%flag里面没有等于j的值
queue(head)=j;
head=head+1;
flag=[flag j];
pa(j)=i;
end
end
tail=tail+1;
end
if pa(m)==0 %如果搜索不到汇节点,退出循环
break;
end
path=[];
i=m; %从汇节点开始
k=0; %路径包含的边的个数
while i~=1 %使用前趋构造从源节点到汇节点的路径
path=[path;pa(i) i A(pa(i),i)]; %存入路径,从得到的前趋节点数组中能得到找到的增广路经
i=pa(i); %使用前趋表反向搜寻,借鉴Dijsktra中的松弛方法
k=k+1;
end
Mi=min(path(:,3)); %寻找(残量网络中)增广路径中最小的那条边
for i=1:k
A(path(i,1),path(i,2))=A(path(i,1),path(i,2))-Mi;%更新残量网络
maxflow(path(i,1),path(i,2))=maxflow(path(i,1),path(i,2))+Mi; %给零流增广,寻找可行最大流
end %使用新的图A进入下一循环,从新开始找增广路径
end
M=sum(maxflow(1,:));
没有合适的资源?快使用搜索试试~ 我知道了~
Fold-Fulkerson求最小割
共5个文件
m:4个
asv:1个
5星 · 超过95%的资源 需积分: 10 7 下载量 81 浏览量
2013-08-09
17:22:32
上传
评论
收藏 4KB RAR 举报
温馨提示
Fold-Fulkerson求最小割问题,寻找增广路经,对边进行增广,知道没有增广路经,就得到了最大流,最大流等于最小割。
资源推荐
资源详情
资源评论
收起资源包目录
Fold-Fulkerson求最小割.rar (5个子文件)
Fold-Fulkerson求最小割
cutresult.m 1KB
FoldFulkerson.m 2KB
main.m 1KB
compresstable2matrix.m 202B
FoldFulkerson.asv 2KB
共 5 条
- 1
资源评论
- weisumeng2016-08-13很好,是真的Fold-Fulkerson算法code
yuanyuansyt
- 粉丝: 0
- 资源: 1
上传资源 快速赚钱
- 我的内容管理 展开
- 我的资源 快来上传第一个资源
- 我的收益 登录查看自己的收益
- 我的积分 登录查看自己的积分
- 我的C币 登录后查看C币余额
- 我的收藏
- 我的下载
- 下载帮助
安全验证
文档复制为VIP权益,开通VIP直接复制
信息提交成功