最大流最小割实现matlab,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

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值