Изменения

Перейти к: навигация, поиск
Алгоритм
==Алгоритм==
{{Определение
|definition=
Дополнением или обратным к графу <tex>G</tex> называется такой граф <tex>H</tex>, имеющий то же множество вершин, что и <tex>G</tex>, но в котором две несовпадающие вершины смежны тогда и только тогда, когда они не смежны в <tex>G</tex>}}
Данная задачи решается с помощью поиска в глубину в 3 этапа:
#Построить транспонированный обратный граф#Выполнить в транспонированном обратном графе поиск в глубину и найти <tex>f[u] </tex> - время окончания обработки вершины ''<tex>u''</tex>#Выполнить поиск глубину в '''''<tex>G'''''</tex>, перебирая вершины во внешнем цикле в порядке убывания <tex>f[u]</tex>Полученные на 3-ем этапе деревья поиска в глубину будут являться компонентами сильной связности графа '''''<tex>G'''''</tex>Так как компоненты сильной связности исходного и транспонированного обратного графа совпадают, то первый поиск в глубину для нахождения <tex>f[u] </tex> можно выполнить на графе '''''<tex>G'''''</tex>, а второй - на транспонированномобратном.
===Доказательство===
Рассмотрим пару вершин ''<tex>s'' </tex> и ''<tex>t''</tex>.Если вершины ''<tex>s'' </tex> и ''<tex>t'' </tex> взаимно достижимы, то они обязательно будут находиться в одном дереве поиска в глубину, поскольку, когда просматривается первая из них, вторая остаётся непосещённой и достижимой из первой и будет просмотрена, прежде чем завершится рекурсивный вызов из корня.Теперь докажем, что если ''<tex>s'' </tex> и ''<tex>t'' </tex> находятся в одном дереве поиска, то они являются сильно связанными. Пусть ''<tex>r'' </tex> - корень этого дерева. Тогда ''<tex>s'' </tex> достижима из ''<tex>r''</tex>, из чего следует, что в обратном графе ''r'' <tex>s</tex> достижима из ''<tex>s''</tex>. Но ''<tex>r'' </tex> имеет большее время окончания обработки <tex>f[r] </tex> > <tex> f[s]</tex>, из чего следует что в обратном графе существует путь из ''<tex>r'' </tex> в ''<tex>s''</tex>. Тогда в исходном графе существуют пути как из ''<tex>s'' </tex> в ''<tex>r''</tex>, так и из ''<tex>r'' </tex> в ''<tex>s''</tex>, т.е. ''<tex>r'' </tex> и ''<tex>s'' </tex> сильно связаны. Те же рассуждения доказывают, что ''<tex>t'' </tex> и ''<tex>r'' </tex> сильно связаны, из чего следует что ''<tex>t'' </tex> и ''<tex>s'' </tex> также сильно связаны. 
==Пример реализации==
vector<vector<int>> g, g1; //g хранит граф в виде списка смежностей, g1 - обратный
Анонимный участник

Навигация