网络流——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))
最后编辑于
©著作权归作者所有,转载或内容合作请联系作者
  • 序言:七十年代末,一起剥皮案震惊了整个滨河市,随后出现的几起案子,更是在滨河造成了极大的恐慌,老刑警刘岩,带你破解...
    沈念sama阅读 213,752评论 6 493
  • 序言:滨河连续发生了三起死亡事件,死亡现场离奇诡异,居然都是意外死亡,警方通过查阅死者的电脑和手机,发现死者居然都...
    沈念sama阅读 91,100评论 3 387
  • 文/潘晓璐 我一进店门,熙熙楼的掌柜王于贵愁眉苦脸地迎上来,“玉大人,你说我怎么就摊上这事。” “怎么了?”我有些...
    开封第一讲书人阅读 159,244评论 0 349
  • 文/不坏的土叔 我叫张陵,是天一观的道长。 经常有香客问我,道长,这世上最难降的妖魔是什么? 我笑而不...
    开封第一讲书人阅读 57,099评论 1 286
  • 正文 为了忘掉前任,我火速办了婚礼,结果婚礼上,老公的妹妹穿的比我还像新娘。我一直安慰自己,他们只是感情好,可当我...
    茶点故事阅读 66,210评论 6 385
  • 文/花漫 我一把揭开白布。 她就那样静静地躺着,像睡着了一般。 火红的嫁衣衬着肌肤如雪。 梳的纹丝不乱的头发上,一...
    开封第一讲书人阅读 50,307评论 1 292
  • 那天,我揣着相机与录音,去河边找鬼。 笑死,一个胖子当着我的面吹牛,可吹牛的内容都是我干的。 我是一名探鬼主播,决...
    沈念sama阅读 39,346评论 3 412
  • 文/苍兰香墨 我猛地睁开眼,长吁一口气:“原来是场噩梦啊……” “哼!你这毒妇竟也来了?” 一声冷哼从身侧响起,我...
    开封第一讲书人阅读 38,133评论 0 269
  • 序言:老挝万荣一对情侣失踪,失踪者是张志新(化名)和其女友刘颖,没想到半个月后,有当地人在树林里发现了一具尸体,经...
    沈念sama阅读 44,546评论 1 306
  • 正文 独居荒郊野岭守林人离奇死亡,尸身上长有42处带血的脓包…… 初始之章·张勋 以下内容为张勋视角 年9月15日...
    茶点故事阅读 36,849评论 2 328
  • 正文 我和宋清朗相恋三年,在试婚纱的时候发现自己被绿了。 大学时的朋友给我发了我未婚夫和他白月光在一起吃饭的照片。...
    茶点故事阅读 39,019评论 1 341
  • 序言:一个原本活蹦乱跳的男人离奇死亡,死状恐怖,灵堂内的尸体忽然破棺而出,到底是诈尸还是另有隐情,我是刑警宁泽,带...
    沈念sama阅读 34,702评论 4 337
  • 正文 年R本政府宣布,位于F岛的核电站,受9级特大地震影响,放射性物质发生泄漏。R本人自食恶果不足惜,却给世界环境...
    茶点故事阅读 40,331评论 3 319
  • 文/蒙蒙 一、第九天 我趴在偏房一处隐蔽的房顶上张望。 院中可真热闹,春花似锦、人声如沸。这庄子的主人今日做“春日...
    开封第一讲书人阅读 31,030评论 0 21
  • 文/苍兰香墨 我抬头看了看天上的太阳。三九已至,却和暖如春,着一层夹袄步出监牢的瞬间,已是汗流浃背。 一阵脚步声响...
    开封第一讲书人阅读 32,260评论 1 267
  • 我被黑心中介骗来泰国打工, 没想到刚下飞机就差点儿被人妖公主榨干…… 1. 我叫王不留,地道东北人。 一个月前我还...
    沈念sama阅读 46,871评论 2 365
  • 正文 我出身青楼,却偏偏与公主长得像,于是被迫代替她去往敌国和亲。 传闻我的和亲对象是个残疾皇子,可洞房花烛夜当晚...
    茶点故事阅读 43,898评论 2 351

推荐阅读更多精彩内容

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