在网络优化、交通调度、资源分配等实际问题中,最大流算法扮演着至关重要的角色。本教程将带你从零开始,使用Python语言实现经典的最大流算法,即使你是编程小白,也能轻松理解并动手实践!
想象一个供水系统:水源(源点)通过一系列管道(边)向用户(汇点)供水。每条管道都有最大流量限制(容量)。最大流问题就是求从源点到汇点最多能输送多少单位的水。
在图论中,这被建模为一个有向图,其中:

解决最大流问题的经典算法主要有两种:
本文将重点讲解并实现 Edmonds-Karp 算法,因为它更稳定、易于理解和编码。
我们将使用邻接矩阵表示图,并借助队列实现BFS查找增广路径。
from collections import dequedef bfs(residual_graph, source, sink, parent): """ 使用BFS在残量图中寻找从source到sink的路径 如果找到路径,返回True,并通过parent记录路径 """ visited = [False] * len(residual_graph) queue = deque() queue.append(source) visited[source] = True parent[source] = -1 while queue: u = queue.popleft() for v in range(len(residual_graph)): if not visited[v] and residual_graph[u][v] > 0: queue.append(v) parent[v] = u visited[v] = True if v == sink: return True return Falsedef edmonds_karp(graph, source, sink): """ Edmonds-Karp算法实现最大流 graph: 邻接矩阵,graph[i][j] 表示从i到j的容量 source: 源点索引 sink: 汇点索引 返回最大流量 """ # 创建残量图(初始等于原图) residual_graph = [row[:] for row in graph] parent = [-1] * len(graph) max_flow = 0 # 不断寻找增广路径 while bfs(residual_graph, source, sink, parent): # 找到路径上的最小残量(即该路径能增加的最大流量) path_flow = float('inf') s = sink while s != source: path_flow = min(path_flow, residual_graph[parent[s]][s]) s = parent[s] # 更新残量图 v = sink while v != source: u = parent[v] residual_graph[u][v] -= path_flow residual_graph[v][u] += path_flow # 反向边 v = parent[v] max_flow += path_flow return max_flow# 示例:构建一个简单网络if __name__ == "__main__": # 节点数量:0=源点, 1,2=中间节点, 3=汇点 graph = [ [0, 16, 13, 0], # 0 -> 1 (16), 0 -> 2 (13) [0, 0, 10, 12], # 1 -> 2 (10), 1 -> 3 (12) [0, 4, 0, 14], # 2 -> 1 (4), 2 -> 3 (14) [0, 0, 0, 0] # 汇点无出边 ] source = 0 sink = 3 result = edmonds_karp(graph, source, sink) print(f"最大流量为: {result}") # 输出应为231. bfs 函数:在残量图(residual graph)中寻找从源点到汇点的路径。残量图记录了每条边还能增加多少流量。
2. edmonds_karp 函数:主逻辑。每次找到一条增广路径后,计算该路径能承载的最小容量(称为“瓶颈”),然后更新残量图——正向边减去流量,反向边加上流量(这是关键!允许“撤销”之前的选择)。
3. 示例图中,最大流为23,这可以通过多条路径组合实现(如 0→1→3 流12,0→2→3 流11,同时利用反向边调整)。
反向边是最大流算法的核心思想之一。它允许算法“回退”之前的流量分配,从而探索更优的路径组合。例如,如果先走了一条次优路径,后续可通过反向边“退还”部分流量,重新分配到更好的路径上。
通过本教程,你已经掌握了使用Python最大流算法解决网络流问题的基本方法。无论是学习网络流算法理论,还是准备面试、参加竞赛,Edmonds-Karp算法和Ford-Fulkerson方法都是必备技能。
建议你尝试修改示例图,或用邻接表代替邻接矩阵来优化空间复杂度。动手实践是掌握算法的最佳方式!
本文由主机测评网于2025-12-08发表在主机测评网_免费VPS_免费云服务器_免费独立服务器,如有疑问,请联系我们。
本文链接:https://www.vpshk.cn/2025124584.html