网络流——Ford-Fulkerson 算法

最大流算法

Ford-Fulkerson 算法是用于计算容量网络 < V,E,c,s,t> 的最大流的算法。该算法主要基于如下定理:

定理: 可行流 f 是最大流当且仅当不存在关于 f 的增广链。

Ford-Fulkerson 将不断寻找图中存在的增广链,并调整该链所包含边的流量 f(i,j),使得网络的流量 v(f) 增加。当图中不再存在关于 f 的增广链时,f 即为最大流。

算法(Ford-Fulkerson)

  • 输入:c\in\mathbb R^{n\times n}, 1\leqslant s,t\leqslant n
    其中 c(i,j) 为有向边 i\rightarrow j 的容量,s,t 是容量网络的起点和终点。
  • 输出:f\in\mathbb R^{n\times n}
    其中 f 为最大流。

\mathrm{while(1)}

a. 寻找网络的增广链
b. 调整增广链上的流量

下面的问题是如何从给定的 c,f 中寻找增广链

寻找增广链

寻找增广链的过程类似于在图中构造子树。于是,集合 T 用来存储正在检查的顶点,R 用来存储还未被检查过的顶点:

  • T=\{s\},~R=V-\{s\}
  • T 中取出一个顶点 i,然后将其在 R 中的邻接点加入 T,并记录相应的路径和流量;
  • 如果 i 的邻接点集中包含终点 t,说明已经找到增广链,退出循环;
  • T 中删除 i,从 R 中删除 i 及其邻接点;
  • T\neq\phi 时,回到第二步;
  • 如果结束循环时 T=\phi,说明没有找到增广链,f 就是最大流,结束程序。

调整增广链上的流量

  • 将增广链上的 f(i,j) 全部加上 \delta

代码实现(MATBALB)

function f = FordFulkerman( c,s,t )
n=length(c);
f=zeros(n); % 初始流
while(1) % 开始寻找增长链
    T=s;R=setdiff(1:n,s);
    l=zeros(1,n);delta=zeros(1,n);delta(s)=inf;
    while(~isempty(T))
        i=T(1); % 选取元素
        T(T==i)=[];R(R==i)=[]; % 删除元素
        J=R(f(i,R)<c(i,R)); % i->j
        T=union(T,J);
        l(J)=i;delta(J)=min(delta(i),c(i,J)-f(i,J)); % 更新l,delta
        if(find(J==t,1)) % 邻接集中包含t
            T=-1;break;
        end
        R=setdiff(R,J);
        J=R(f(R,i)>0); % j->i 
        T=union(T,J);
        l(J)=-i;delta(J)=min(delta(i),f(J,i)); % 更新l,delta
        if(find(J==t,1)) % 邻接集中包含t
            T=-1;break;
        end
        R=setdiff(R,J);
    end
    if(T==-1) % 存在增广链
        delta=delta(t); % 用于调整的值
        j=t;i=l(j); % 更新f
        while(i)
            if(i>0) % i->j
                f(i,j)=f(i,j)+delta;
            else % j->i
                i=-i;
                f(j,i)=f(j,i)+delta;
            end
            j=i;i=l(j);
        end
    else % 程序结束
        return;
    end
end
end

使用以下指令即可获得最大流 f 的流量:

v=sum(f(s,:))-sum(f(:,s))
最后编辑于
©著作权归作者所有,转载或内容合作请联系作者
平台声明:文章内容(如有图片或视频亦包括在内)由作者上传并发布,文章内容仅代表作者本人观点,简书系信息发布平台,仅提供信息存储服务。

推荐阅读更多精彩内容

  • 目录 1.流网络及最大流问题1.1 流网络1.2 最大流问题1.3 最大流问题的三种解法对比 2.Ford-Ful...
    王侦阅读 4,718评论 0 3
  • 最大流&&最小费用最大流&&最大二分匹配 中文是2017年8月的笔记,英文是2018.11月的笔记 英文笔记来自于...
    廖少少阅读 35,234评论 6 20
  • 归去来兮。 1.1 说明 本篇为《挑战程序设计竞赛(第2版)》[http://www.ituring.com.cn...
    尤汐Yogy阅读 14,470评论 0 160
  • 转载:网络流基础篇——Edmond-Karp算法网络流的相关定义: 源点:有n个点,有m条有向边,有一个点很特殊,...
    Gitfan阅读 3,539评论 0 8
  • 一切要从一张小费单说起,不过还有些前话。 2016年四月在吴哥窟,一中国老年旅行团在崩密列寺最高处休息...
    上的影阅读 204评论 0 0