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

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

原文:http://blog.csdn.net/qq_21555605/article/details/47680319

  • 0
    点赞
  • 3
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
最大流最小割算法是图论中的经典问题,可以用于解决网络流问题。下面是一个基于Ford-Fulkerson算法最大流最小割算法的Python实现。 ```python from collections import defaultdict # 使用 BFS 定义增广路径 def BFS(graph, start, end, parent): # 初始化所有的节点为未访问 visited = [False] * (len(graph)) # 创建一个队列,用于 BFS queue = [] # 将起点标记为已访问,并将其加入队列中 queue.append(start) visited[start] = True # 从源节点开始标准 BFS while queue: # 取出队列中的节点,并遍历其相邻节点 u = queue.pop(0) for ind, val in enumerate(graph[u]): if visited[ind] == False and val > 0: queue.append(ind) visited[ind] = True parent[ind] = u # 如果能够到达汇点,则表示存在增广路径 return True if visited[end] else False # 使用 Ford Fulkerson 算法求解最大流 def max_flow(graph, source, sink): # 初始化父节点 parent = [-1] * (len(graph)) # 初始化最大流 max_flow = 0 # 不断寻找增广路径 while BFS(graph, source, sink, parent) : # 找到增广路径上流量最小的边 path_flow = float("Inf") s = sink while(s != source): path_flow = min(path_flow, graph[parent[s]][s]) s = parent[s] # 更新路径上每个边的流量 v = sink while(v != source): u = parent[v] graph[u][v] -= path_flow graph[v][u] += path_flow v = parent[v] # 更新最大流 max_flow += path_flow # 返回最大流 return max_flow ``` 上述代码实现了一个简单的Ford-Fulkerson算法,其中BFS函数用于在残余图上找到一条增广路径,max_flow函数则用于计算最大流

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值