matlab实现基于DFS的Ford_Fulkerson最大流最小割算法

function [F, maxf, V, S] = Ford_Fulkerson(C, src, sink)

n = size(C, 1);

F = zeros(n);
maxf = 0;
V = [];
S = [];

while true
    % in: ResNet.
    ResNet = C - F + F';   % residual network.
    % out: pre, Df
    pre = ones(1, n) * NaN;
    Df = ones(1, n) * inf;
    % DFS to find augmenting path.
    stk = [ src ];
    unvisited = setdiff(1:n, src);
    while ~isempty(stk)
        if stk(1) == sink
            break;
        end
            % pop
        from = stk(1);
        stk(1) = [];

            % fot v in adj(u)
        [~, to] = find(ResNet(from, unvisited) > 0);
        tovisit = unvisited(unique(to));
            % visit
        pre(tovisit) = from;
        Df(tovisit) = min(Df(from), ResNet(from, tovisit));

            % push
        stk = [tovisit, stk];
        unvisited = setdiff(unvisited, tovisit);
    end
    % DFS end.

    if isempty(stk)
        % not found. max flow get.
        S = setdiff(1:n, unvisited);
        V = unvisited;
        break;

    else
        % Augmenting path found.
        %in: pre, Df
        maxf = maxf + Df(sink);
        %update arc.
        t = sink;
        while t ~= src
            % pre(t)-t
            if C(pre(t), t) ~= 0
                % forward arc.
                F(pre(t), t) = F(pre(t), t) + Df(sink);
            else
                % backward arc.
                F(t, pre(t)) = F(t, pre(t)) - Df(sink);
            end

            t = pre(t);
        end
    end

end

end

版权声明:本文为博主原创文章,未经博主允许不得转载。

时间: 2024-11-03 22:20:01

matlab实现基于DFS的Ford_Fulkerson最大流最小割算法的相关文章

最大流最小割算法

图像分割中用到最小割原理,引出了最大流最小割算法,主要参考来自UCLA CIVS的Hong Chen的PPT <Introduction to Min-Cut/Max-Flow Algorithms> 一. 首先借用PPT的两张图分别讲述一下两者的应用 1. 最大流应用于网络传输 2. 最小割应用于桥问题 二.基本概念之 s-t 图 1. 源结点(source node)和汇结点(sink node) 2. 从结点i到结点j的有向边(Arc)<i, j> 3. 每条边<i,

最大流最小割 算法理解

by   http://blog.csdn.net/chinacoy/article/details/45040897 理解算法. 首先从最简单的开始,先看一幅图:  有3个节点S,a,T,边[S,a]的容量是10,边[a,T]的容量是5,假设从S处要传送数据到T,问最大传送数据量是多少?应该是min(10,5)=5.如果超出5,[a,T]边容不下,因此传不过去,此时的最大流量就是5,[a,T]边就是该图的一条最小割.该图可以想象成从S到T通水,需要修建水管,a是中间站点,S到a修建的水管可以容

hihocoder 网络流二&#183;最大流最小割定理

网络流二·最大流最小割定理 时间限制:10000ms 单点时限:1000ms 内存限制:256MB 描述 小Hi:在上一周的Hiho一下中我们初步讲解了网络流的概念以及常规解法,小Ho你还记得内容么? 小Ho:我记得!网络流就是给定了一张图G=(V,E),以及源点s和汇点t.每一条边e(u,v)具有容量c(u,v).网络流的最大流问题求解的就是从s到t最多能有多少流量. 小Hi:那这个问题解决办法呢? 小Ho:解决网络流的基本思路就是寻找增广路,不断更新残留网络.直到找不到新的增广路,此时得到的

【codevs1907】方格取数3(最大流最小割定理)

网址:http://codevs.cn/problem/1907/ 题意:在一个矩阵里选不相邻的若干个数,使这些数的和最大. 我们可以把它看成一个最小割,答案就是矩阵中的所有数-最小割.先把矩阵按国际象棋棋盘黑白染色(即把相邻的点分别染成白色和黑色),然后黑点连源点,白点连汇点.割掉一个点到源/汇的边就是不选择这个点,最后的目的就是使源到汇不连通(不引发题目不能选择位置相邻的数的矛盾). 然而最小割怎么求呢? 于是我们就要引入一个定理:最大流最小割定理.它的意思就是说,在一个图中,a点到b点的最

poj3469(最大流最小割问题)

题目链接:http://poj.org/problem?id=3469 Dual Core CPU Time Limit: 15000MS   Memory Limit: 131072K Total Submissions: 18147   Accepted: 7833 Case Time Limit: 5000MS Description As more and more computers are equipped with dual core CPU, SetagLilb, the Chi

最大流最小割一题

a 看完题目,根本没想法,暴力的复杂度是指数级别的,枚举所有的集合,当时有点紧张,暴力的都没写,其实没思路的 时候最好写暴力的算法,骗点分就可以了.后来,看了牛客网上大神的思路,然后学习了下最大流最小割的方法,这题的 做法就是枚举源点和汇点,跑最大流算法,然后用流量更新答案,同时保存最小割,最后输出,就可以了. 简单写了下,也是无法实际运行去判断正误. 对最大流最小割的思路理解的不是很透彻,不知道怎么求最小割,没有做这方面的练习. 1 #include <iostream> 2 #includ

hihoCoder1378 (最大流最小割)

#1378 : 网络流二·最大流最小割定理 时间限制:10000ms 单点时限:1000ms 内存限制:256MB 描述 小Hi:在上一周的Hiho一下中我们初步讲解了网络流的概念以及常规解法,小Ho你还记得内容么? 小Ho:我记得!网络流就是给定了一张图G=(V,E),以及源点s和汇点t.每一条边e(u,v)具有容量c(u,v).网络流的最大流问题求解的就是从s到t最多能有多少流量. 小Hi:那这个问题解决办法呢? 小Ho:解决网络流的基本思路就是寻找增广路,不断更新残留网络.直到找不到新的增

HDU-4289-Control(最大流最小割,拆点)

链接: https://vjudge.net/problem/HDU-4289 题意: You, the head of Department of Security, recently received a top-secret information that a group of terrorists is planning to transport some WMD 1 from one city (the source) to another one (the destination)

[最短路,最大流最小割定理] 2019 Multi-University Training Contest 1 Path

题目:http://acm.hdu.edu.cn/showproblem.php?pid=6582 Path Time Limit: 2000/1000 MS (Java/Others)    Memory Limit: 262144/262144 K (Java/Others)Total Submission(s): 3747    Accepted Submission(s): 1075 Problem Description Years later, Jerry fell in love