Использование обхода в глубину для поиска мостов — различия между версиями
Niko (обсуждение | вклад) (→Алгоритм) |
(→Алгоритм) |
||
Строка 9: | Строка 9: | ||
<tex> \Leftarrow</tex> <br> | <tex> \Leftarrow</tex> <br> | ||
Удалим <tex> (u, v)</tex> из <tex> G</tex>. Докажем, что мы не сможем достичь ни одного из предков <tex> v </tex> (в частности <tex> u </tex>). Докажем этот факт от противного. | Удалим <tex> (u, v)</tex> из <tex> G</tex>. Докажем, что мы не сможем достичь ни одного из предков <tex> v </tex> (в частности <tex> u </tex>). Докажем этот факт от противного. | ||
− | Пусть это не так, и <tex> w</tex> - предпоследняя вершина на пути от <tex> v</tex> до ее предка <tex>x </tex>. Очевидно, <tex> (w, x)</tex> не ребро дерева (в силу единственности пути в дереве). Если <tex> (w, x)</tex> - обратное ребро, то это противоречит условию теоремы, так как <tex> x</tex> - предок <tex> u</tex>. Следовательно мы не достигнем предков <tex>v</tex>, а значит количество компонент связности увеличилось, что | + | Пусть это не так, и <tex> w</tex> - предпоследняя вершина на пути от <tex> v</tex> до ее предка <tex>x </tex>. Очевидно, <tex> (w, x)</tex> не ребро дерева (в силу единственности пути в дереве). Если <tex> (w, x)</tex> - обратное ребро, то это противоречит условию теоремы, так как <tex> x</tex> - предок <tex> u</tex>. Следовательно мы не достигнем предков <tex>v</tex>, а значит количество компонент связности увеличилось, что поэтому ребро <tex>(u, v)</tex> является мостом.<br> |
<tex> \Rightarrow</tex> <br> | <tex> \Rightarrow</tex> <br> | ||
Пусть существует удовлетворяющее условию обратное ребро <tex>(x, w)</tex>. Тогда <tex>(u, v)</tex> лежит на цикле <tex>x \rightsquigarrow v \rightarrow u \rightsquigarrow w \rightarrow x</tex> и не может быть мостом. | Пусть существует удовлетворяющее условию обратное ребро <tex>(x, w)</tex>. Тогда <tex>(u, v)</tex> лежит на цикле <tex>x \rightsquigarrow v \rightarrow u \rightsquigarrow w \rightarrow x</tex> и не может быть мостом. |
Версия 08:36, 23 ноября 2011
Содержание
Постановка задачи
Дан неориентированный граф . Найти все мосты в за время
Алгоритм
Теорема: |
Пусть обхода в глубину графа . Ребро является мостом тогда и только тогда, когда и из вершины и любого ее потомка нет обратного ребра в вершину или предка - дерево |
Доказательство: |
|
Функция
Определим функцию
- время входа в вершину
-
-
Лемма
Лемма: |
Ребро является мостом тогда и только тогда, когда принадлежит дереву обхода в глубину и |
Доказательство: |
Рассмотрим вершину Таким образом, если для текущего ребра или её потомка. Из них есть обратное ребро обратное в в предка , тогда и только тогда, когда найдется такой сын , что . Так как, если , то это означает, что найдётся обратное ребро, приходящее точно в . Если же , то это означает наличие обратного ребра в какого-либо предка вершины . (принадлежащего дереву поиска) выполняется , то это ребро является мостом; в противном случае оно мостом не является. |
Утверждение: |
|
1) |
Псевдокод
dfs() for всех смежных с if - обратное ребро if вершина - белая dfs(u) if ребро - мост
Источники
Литература
Седжвик Роберт. Фундаментальные алгоритмы на C++. Часть 5: Алгоритмы на графах: Пер. с англ./Роберт Седжвик. — СПб.: ООО «ДиаСофтЮП», 2002. — С. 123-128