@@ -1143,6 +1143,68 @@ def _breadth_first_search_max_flow(graph: Graph, source_node, sink_node, flow_pa
1143
1143
return (0 , parent )
1144
1144
1145
1145
1146
+ def _copy_graph_with_residual_edges (graph : Graph ) -> Graph :
1147
+ vertices = [graph .__getattribute__ (v ) for v in graph .vertices ]
1148
+ new_graph = type (graph )(* vertices )
1149
+
1150
+ for key , edge in graph .edge_weights .items ():
1151
+ new_graph .add_edge (edge .source .name , edge .target .name , edge .value )
1152
+
1153
+
1154
+ for key , edge in list (new_graph .edge_weights .items ()):
1155
+ src = edge .source .name
1156
+ tgt = edge .target .name
1157
+ if new_graph .get_edge (tgt , src ) is None :
1158
+ new_graph .add_edge (tgt , src , 0 )
1159
+
1160
+ return new_graph
1161
+
1162
+
1163
+ def _dfs_max_flow (graph : Graph , node , sink , flow_passed , visited , flow ):
1164
+ if node == sink :
1165
+ return flow
1166
+
1167
+ visited [node ] = True
1168
+
1169
+ for next_node in graph .neighbors (node ):
1170
+ capacity = graph .get_edge (node , next_node .name ).value
1171
+ fp = flow_passed .get ((node , next_node .name ), 0 )
1172
+ residual_capacity = capacity - fp
1173
+
1174
+ if residual_capacity > 0 and next_node .name not in visited :
1175
+ bottleneck_flow = _dfs_max_flow (
1176
+ graph , next_node .name , sink , flow_passed , visited , min (flow , residual_capacity )
1177
+ )
1178
+ if bottleneck_flow > 0 :
1179
+ flow_passed [(node , next_node .name )] = fp + bottleneck_flow
1180
+ flow_passed [(next_node .name , node )] = flow_passed .get ((next_node .name , node ), 0 ) - bottleneck_flow
1181
+ return bottleneck_flow
1182
+
1183
+ return 0
1184
+
1185
+ def _max_flow_ford_fulkerson_ (graph : Graph , source , sink ):
1186
+ graph_copy = _copy_graph_with_residual_edges (graph )
1187
+
1188
+ m_flow = 0
1189
+ flow_passed = {}
1190
+
1191
+ # Add residual edges to the graph.
1192
+ print (graph .neighbors ('a' ))
1193
+
1194
+ while True :
1195
+ # Use a dictionary for visited nodes. Reset for each new DFS call.
1196
+ visited = {}
1197
+ new_flow = _dfs_max_flow (graph_copy , source , sink , flow_passed , visited , float ('inf' ))
1198
+
1199
+ # If no augmenting path is found, exit the loop.
1200
+ if new_flow == 0 :
1201
+ break
1202
+
1203
+ m_flow += new_flow
1204
+
1205
+ return m_flow
1206
+
1207
+
1146
1208
def _max_flow_edmonds_karp_ (graph : Graph , source , sink ):
1147
1209
m_flow = 0
1148
1210
flow_passed = {}
0 commit comments