Skip to content

Commit f3832ae

Browse files
authored
Remove unreachable from source cycles in max flow
1 parent 3db3b04 commit f3832ae

File tree

1 file changed

+8
-9
lines changed

1 file changed

+8
-9
lines changed

max-flow.md

+8-9
Original file line numberDiff line numberDiff line change
@@ -341,7 +341,7 @@ def min_cost_max_flow(s, t):
341341
return None
342342
build_network()
343343
result_flow = edmonds_karp(s, t)
344-
remove_cycles(s)
344+
remove_cycles()
345345
result_cost = flow_cost()
346346
return result_flow, result_cost
347347
```
@@ -354,17 +354,17 @@ def flow_cost():
354354
return sum(map(edge_cost, network_edges())) // 2
355355
```
356356

357-
Теперь перейдем к функции `remove_cycles`. В ней мы будем в цикле искать отрицательные циклы, пропускать по ним поток, устраняя их и тем самым уменьшая стоимость потока. Как только отрицательный цикл не найден, алгоритм можно завершать.
357+
Теперь перейдем к функции `remove_cycles`. В ней мы будем в цикле искать отрицательные циклы, пропускать по ним поток, устраняя их и тем самым уменьшая стоимость потока. Как только отрицательный цикл не найден, алгоритм можно завершать. Также нельзя начинать поиск цикла из вершины `s`, так как в остаточной сети, по которой уже пропущен максимальный поток, некоторые вершины и, соответственно, циклы могут быть недостижимы из вершины `s`. Поэтому начнем алгоритм "одновременно" из всех вершин сети, присвоив им значение `0` в массиве `dist` (при этом физический смысл значений в массиве теряется).
358358

359359
```python
360-
def remove_cycles(s):
360+
def remove_cycles():
361361

362362
while True:
363363
for v in range(n):
364364
pred[v] = None
365-
dist[v] = None
365+
dist[v] = 0 # <-- здесь!
366366

367-
v = find_cycle(s)
367+
v = find_cycle()
368368
if v is None:
369369
break
370370

@@ -376,8 +376,7 @@ def remove_cycles(s):
376376
Находить цикл отрицательной стоимости будем с помощью алгоритма Форда-Беллмана. Если на последней итерации алгоритма была найдена вершина, для которой проведена релаксация, то эта вершина достижима из искомого цикла, и именно ее мы вернем.
377377

378378
```python
379-
def find_cycle(s):
380-
dist[s] = 0
379+
def find_cycle():
381380

382381
for i in range(n): # <-- делаем последнюю итерацию
383382

@@ -386,10 +385,10 @@ def find_cycle(s):
386385
u = target(e)
387386
c = cost(e)
388387

389-
if dist[v] is None or available(e) == 0:
388+
if available(e) == 0:
390389
continue
391390

392-
if dist[u] is None or dist[u] > dist[v] + c:
391+
if dist[u] > dist[v] + c:
393392
dist[u] = dist[v] + c
394393
pred[u] = e
395394

0 commit comments

Comments
 (0)