1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46 47 48 49 50 51 52 53 54 55 56 57 58 59 60 61 62
| from collections import defaultdict
class Graph: def __init__(self, graph): self.graph = graph self.ROW = len(graph) def BFS(self, s, t, parent): visited = [False] * (self.ROW) queue = [] queue.append(s) visited[s] = True while queue: u = queue.pop(0) for ind, val in enumerate(self.graph[u]): if visited[ind] == False and val > 0: queue.append(ind) visited[ind] = True parent[ind] = u if ind == t: return True return False def FordFulkerson(self, source, sink): parent = [-1] * (self.ROW) max_flow = 0 while self.BFS(source, sink, parent): //不断寻找增广路径 path_flow = float("Inf") s = sink while(s != source): //从汇点向源点回溯 不断更新该路径的最小流量 path_flow = min(path_flow, self.graph[parent[s]][s]) s = parent[s] max_flow += path_flow v = sink while(v != source): u = parent[v] self.graph[u][v] -= path_flow self.graph[v][u] += path_flow v = parent[v] return max_flow
graph = [[0, 16, 13, 0, 0, 0], [0, 0, 10, 12, 0, 0], [0, 4, 0, 0, 14, 0], [0, 0, 9, 0, 0, 20], [0, 0, 0, 7, 0, 4], [0, 0, 0, 0, 0, 0]]
g = Graph(graph) source = 0 sink = 5 max_flow = g.FordFulkerson(source, sink) print("最大流量为:", max_flow)
|