Изменения

Перейти к: навигация, поиск
Удаляющий обход
Аналогично предыдущей идее, однако будем удалять в процессе обхода в глубину из графа все рёбра, вдоль которых не получится дойти до стока <tex>t</tex>. Это очень легко реализовать: достаточно удалять ребро после того, как мы просмотрели его в обходе в глубину (кроме того случая, когда мы прошли вдоль ребра и нашли путь до стока). С точки зрения реализации, надо просто поддерживать в списке смежности каждой вершины указатель на первое неудалённое ребро, и увеличивать этот указать в цикле внутри обхода в глубину. Корректность при этом сохраняется согласно предыдущему пункту.
<tex>dfs()</tex>
{
<tex>p := [s]</tex> //путь <tex>p</tex>
<tex>v := s</tex>; //текущая вершина и указатель на вершину первого неудалённого ребра
<tex>if</tex>(нет пути из <tex>v</tex>) <tex>if</tex> (<tex>v = s</tex>)
завершить алгоритм;
<tex>else</tex>
{
удалить <tex>(uv)</tex> из <tex>V(G)</tex>; //<tex>uv</tex> - последнее ребро на пути <tex>p</tex>
}
<tex>do</tex>
{
//<tex>w</tex> - вершина смежная с <tex>v</tex>
<tex>v := w;</tex>
}
while(<tex>while(w \ne t);</tex>);
<tex>\delta := min(c(vw) - f(vw), (vw)\in p);</tex>
foreach <tex>foreach (vw)\in p </tex>
<tex>f(vw)+= \delta;</tex> //увеличиваем поток вдоль пути <tex>p</tex>
<tex>if</tex> (ребро <tex>(vw)</tex> насыщено)
удалить <tex>(vw)</tex> из <tex>V(G);</tex>
<tex>dfs();</tex>
}
Анонимный участник

Навигация