|
18 | 18 | Reference: https://en.wikipedia.org/wiki/Dinic%27s_algorithm |
19 | 19 | """ |
20 | 20 |
|
21 | | -from __future__ import annotations |
22 | | - |
23 | 21 | from collections import deque |
24 | 22 |
|
25 | 23 |
|
@@ -60,7 +58,7 @@ def __init__(self, vertices: int) -> None: |
60 | 58 | if vertices <= 0: |
61 | 59 | raise ValueError("number of vertices must be positive") |
62 | 60 | self.size = vertices |
63 | | - # graph[u] holds indices into self.edges for edges leaving u. |
| 61 | + # graph[vertex] holds indices into self.edges for edges leaving that vertex. |
64 | 62 | self.graph: list[list[int]] = [[] for _ in range(vertices)] |
65 | 63 | # Each edge is stored as [destination, residual_capacity]. |
66 | 64 | # Edge i and its reverse edge i ^ 1 are always created together. |
@@ -96,37 +94,37 @@ def _build_level_graph(self, source: int) -> list[int]: |
96 | 94 | level[source] = 0 |
97 | 95 | queue = deque([source]) |
98 | 96 | while queue: |
99 | | - u = queue.popleft() |
100 | | - for edge_index in self.graph[u]: |
| 97 | + vertex = queue.popleft() |
| 98 | + for edge_index in self.graph[vertex]: |
101 | 99 | destination, residual = self.edges[edge_index] |
102 | 100 | if residual > 0 and level[destination] == -1: |
103 | | - level[destination] = level[u] + 1 |
| 101 | + level[destination] = level[vertex] + 1 |
104 | 102 | queue.append(destination) |
105 | 103 | return level |
106 | 104 |
|
107 | 105 | def _send_flow( |
108 | 106 | self, |
109 | | - u: int, |
| 107 | + vertex: int, |
110 | 108 | pushed: int, |
111 | 109 | sink: int, |
112 | 110 | level: list[int], |
113 | 111 | progress: list[int], |
114 | 112 | ) -> int: |
115 | 113 | """Depth-first search that pushes a blocking flow along the level graph.""" |
116 | | - if u == sink: |
| 114 | + if vertex == sink: |
117 | 115 | return pushed |
118 | | - while progress[u] < len(self.graph[u]): |
119 | | - edge_index = self.graph[u][progress[u]] |
| 116 | + while progress[vertex] < len(self.graph[vertex]): |
| 117 | + edge_index = self.graph[vertex][progress[vertex]] |
120 | 118 | destination, residual = self.edges[edge_index] |
121 | | - if residual > 0 and level[destination] == level[u] + 1: |
| 119 | + if residual > 0 and level[destination] == level[vertex] + 1: |
122 | 120 | flow = self._send_flow( |
123 | 121 | destination, min(pushed, residual), sink, level, progress |
124 | 122 | ) |
125 | 123 | if flow > 0: |
126 | 124 | self.edges[edge_index][1] -= flow |
127 | 125 | self.edges[edge_index ^ 1][1] += flow |
128 | 126 | return flow |
129 | | - progress[u] += 1 |
| 127 | + progress[vertex] += 1 |
130 | 128 | return 0 |
131 | 129 |
|
132 | 130 | def max_flow(self, source: int, sink: int) -> int: |
|
0 commit comments