matlab实现基于DFS的Ford_Fulkerson最大流最小割算法
2017-05-22 16:16
681 查看
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
相关文章推荐
- matlab实现基于DFS的Ford_Fulkerson最大流最小割算法
- 最大流:Ford-Fulkerson方法DFS实现
- [图论]最大流介绍 Ford-Fulkerson算法 邻接表实现
- 贝叶斯网络推理之最大可能解释问题(基于FullBNT-1.0.4的MATLAB实现)
- 《网络流学习笔记02--Edmonds-Karp,Ford-Fulkerson,Dinic三种算法实现最大流》
- 最大流之Ford-Fulkerson方法详解及实现
- 最大流之Ford-Fulkerson方法详解及实现
- USACO-Section 4.2 The Perfect Stall (二分图最大匹配[匈牙利算法[DFS]||网络流[Ford-Fulkerson]])
- HDU 3549 Flow Problem【Ford-Fulkerson+DFS 最大流】
- Ford-Fulkerson算法求最大流Java实现
- C++实现的带最大最小线程数的线程池(基于ACE)
- Ford-Fulkerson与Edmonds-Karp求解最大流
- 7. 网络流算法--Ford-Fulkerson方法及其多种实现
- 基于Matlab的FIR滤波器设计与实现
- 基于字典的【正向最大减字】分词算法实现
- 基于VC实现Java和Matlab的通信
- 网络最大流之一般增广路方法------Ford-Fulkerson
- 网络流算法--Ford-Fulkerson方法及其多种实现
- 基于大顶堆实现的最大优先级队列
- 图像去模糊算法在CUDA上的实现,基于MATLAB平台