Изменения

Перейти к: навигация, поиск
Удаляющий обход
Аналогично предыдущей идее, однако будем удалять в процессе обхода в глубину из графа все рёбра, вдоль которых не получится дойти до стока <tex>t</tex>. Это очень легко реализовать: достаточно удалять ребро после того, как мы просмотрели его в обходе в глубину (кроме того случая, когда мы прошли вдоль ребра и нашли путь до стока). С точки зрения реализации, надо просто поддерживать в списке смежности каждой вершины указатель на первое неудалённое ребро, и увеличивать этот указать в цикле внутри обхода в глубину. Корректность при этом сохраняется согласно предыдущему пункту.
int <tex>dfs (int v, int flow) </tex>
{
<tex>p := [s]</tex> //путь p
<tex>v := s</tex>; //текущая вершина и указатель на вершину первого неудалённого ребра
<tex>if</tex>(нет пути из <tex>v</tex>)
<tex>if</tex> (<tex>v = s</tex>)
завершить алгоритм;
<tex>else</tex>
{
delete <tex>(uv)</tex>; //<tex>uv</tex> - последнее ребро на пути <tex>p</tex>
<tex>p.delete(v)</tex>;
}
<tex>do</tex>
{
//<tex>w</tex> - вершина смежная с v
<tex>p := p+[v]</tex>;
<tex>v := w;</tex>
}
<tex>while(w \noequal t)</tex>
 
 
if (!flow) return 0;
if (v == t) return flow;
Анонимный участник

Навигация