#--------- 入力例1 ---------- N = 6 M = 7 A = [1, 1, 2, 2, 3, 4, 5] B = [2, 4, 3, 5, 6, 5, 6] C = [5, 4, 4, 7, 3, 3, 5] #-----------------------------
from collections import defaultdict
classFordFulkerson: def__init__(self, n): self.n = n self.graph = defaultdict(list) self.visited = [False] * n defadd_edge(self, u, v, c): self.graph[u].append([v, c, len(self.graph[v])]) self.graph[v].append([u, 0, len(self.graph[u]) - 1]) defdfs(self, v, t, f): if v == t: return f self.visited[v] = True for i, (nv, cap, rev) inenumerate(self.graph[v]): if self.visited[nv] or cap == 0: continue d = self.dfs(nv, t, min(f, cap)) if d == 0: continue self.graph[v][i][1] -= d self.graph[nv][rev][1] += d return d return0 defmax_flow(self, s, t): flow = 0 whileTrue: self.visited = [False] * self.n f = self.dfs(s, t, float('inf')) if f == 0: break flow += f return flow
max_flow = FordFulkerson(N + 1) for i inrange(M): max_flow.add_edge(A[i], B[i], C[i])