@@ -1146,31 +1146,24 @@ def _breadth_first_search_max_flow(graph: Graph, source_node, sink_node, flow_pa
1146
1146
def _copy_graph_with_residual_edges (graph : Graph ) -> Graph :
1147
1147
vertices = [graph .__getattribute__ (v ) for v in graph .vertices ]
1148
1148
new_graph = type (graph )(* vertices )
1149
-
1150
1149
for key , edge in graph .edge_weights .items ():
1151
1150
new_graph .add_edge (edge .source .name , edge .target .name , edge .value )
1152
-
1153
-
1154
1151
for key , edge in list (new_graph .edge_weights .items ()):
1155
1152
src = edge .source .name
1156
1153
tgt = edge .target .name
1157
1154
if new_graph .get_edge (tgt , src ) is None :
1158
1155
new_graph .add_edge (tgt , src , 0 )
1159
-
1160
1156
return new_graph
1161
1157
1162
1158
1163
1159
def _dfs_max_flow (graph : Graph , node , sink , flow_passed , visited , flow ):
1164
1160
if node == sink :
1165
1161
return flow
1166
-
1167
1162
visited [node ] = True
1168
-
1169
1163
for next_node in graph .neighbors (node ):
1170
1164
capacity = graph .get_edge (node , next_node .name ).value
1171
1165
fp = flow_passed .get ((node , next_node .name ), 0 )
1172
1166
residual_capacity = capacity - fp
1173
-
1174
1167
if residual_capacity > 0 and next_node .name not in visited :
1175
1168
bottleneck_flow = _dfs_max_flow (
1176
1169
graph , next_node .name , sink , flow_passed , visited , min (flow , residual_capacity )
@@ -1179,24 +1172,18 @@ def _dfs_max_flow(graph: Graph, node, sink, flow_passed, visited, flow):
1179
1172
flow_passed [(node , next_node .name )] = fp + bottleneck_flow
1180
1173
flow_passed [(next_node .name , node )] = flow_passed .get ((next_node .name , node ), 0 ) - bottleneck_flow
1181
1174
return bottleneck_flow
1182
-
1183
1175
return 0
1184
1176
1185
1177
def _max_flow_ford_fulkerson_ (graph : Graph , source , sink ):
1186
1178
graph_copy = _copy_graph_with_residual_edges (graph )
1187
-
1188
1179
m_flow = 0
1189
1180
flow_passed = {}
1190
-
1191
1181
while True :
1192
1182
visited = {}
1193
1183
new_flow = _dfs_max_flow (graph_copy , source , sink , flow_passed , visited , float ('inf' ))
1194
-
1195
1184
if new_flow == 0 :
1196
1185
break
1197
-
1198
1186
m_flow += new_flow
1199
-
1200
1187
return m_flow
1201
1188
1202
1189
0 commit comments