Добавил:
Опубликованный материал нарушает ваши авторские права? Сообщите нам.
Вуз: Предмет: Файл:
Теория графов / Филатова 311 ТГ.pdf
Скачиваний:
13
Добавлен:
18.08.2022
Размер:
247.39 Кб
Скачать

4 Алгоритм Габова

4.1 Описание алгоритма

В1999 году Г. Габову удалось получить эффективный алгоритм поиска сильной связности.

Валгоритме Габова вершины заносятся в главный стек — но параллельно заносятся во второй стек вершины, лежащие на пути поиска, о которых известно, что они находятся в других сильных компонентах, и выталкиваются все вершины после достижения каждого обратного ребра. Когда завершается обработка вершины v (v находится на верхушке второго стека — на рисунке заштриховано), ясно, что все вершины, расположенные над v в главном стеке, находятся в одном и том же сильном компоненте. [8]

4.2 Реализация

Данная альтернативная реализация рекурсивной функции-члена использует вместо вектора low, индексированного номерами вершин, второй стек path, чтобы определять, когда нужно выталкивать из главного стека вершины каждого сильного компонента

1 void scR(int w)

2{ int v;

3pre[w] = cnt++;

4S.push(w); path.push(w);

5typename Graph::adjIterator A(G, w);

6for (int t = A.beg(); !A.end(); t = A.nxt())

7if (pre[t] == -1)

8 scR(t);

9else if (id[t] == -1)

10

while (pre[path.top()] > pre[t]) path.pop();

11if (path.top() == w) path.pop(); else return;

12do { id[v = S.pop()] = scnt; } while (v != w);

13scnt++;

14}

13

Соседние файлы в папке Теория графов