Использование обхода в глубину для поиска мостов — различия между версиями
Niko (обсуждение | вклад) |
Niko (обсуждение | вклад) |
||
| Строка 18: | Строка 18: | ||
* <tex>enter(x)</tex>, где <tex>x</tex> - потомок <tex>v</tex> <br> | * <tex>enter(x)</tex>, где <tex>x</tex> - потомок <tex>v</tex> <br> | ||
* <tex>enter(x)</tex>, где <tex>(w, x)</tex> - обратное ребро, а <tex>w</tex> - потомок <tex>v</tex> (в нестрогом смысле) <br> | * <tex>enter(x)</tex>, где <tex>(w, x)</tex> - обратное ребро, а <tex>w</tex> - потомок <tex>v</tex> (в нестрогом смысле) <br> | ||
| − | + | ||
| + | ===Лемма=== | ||
{{Лемма | {{Лемма | ||
|statement = Ребро <tex>(u, v)</tex> является мостом тогда и только тогда, когда <tex>(u, v)</tex> принадлежит дереву обхода в глубину и <tex>ret(v) > enter(u)</tex> | |statement = Ребро <tex>(u, v)</tex> является мостом тогда и только тогда, когда <tex>(u, v)</tex> принадлежит дереву обхода в глубину и <tex>ret(v) > enter(u)</tex> | ||
Версия 06:13, 27 октября 2011
Содержание
Постановка задачи
Дан неориентированный граф . Найти все мосты в за время
Алгоритм
| Теорема: |
Пусть - дерево обхода в глубину графа . Ребро является мостом тогда и только тогда, когда и из вершины и любого ее потомка нет обратного ребра в вершину или предка |
| Доказательство: |
|
|
Функция
Определим функцию , где , как минимум из следущих величин
- время входа в вершину
- , где - потомок
- , где - обратное ребро, а - потомок (в нестрогом смысле)
Лемма
| Лемма: |
Ребро является мостом тогда и только тогда, когда принадлежит дереву обхода в глубину и |
| Доказательство: |
| Так как на пути от вершины к корню дерева величины убывают, то возвращает величину для ближайшей к корню вершины, достижимой из или ее потомка, возможно используя одно обратное ребро. Следовательно, из вершины или ее потомков существует обратное ребро потомка или саму тогда и только тогда, когда . По доказанной теореме, отсутствие такого ребра эквивалентно тому что - мост. |
| Утверждение: |
=
|
|
1) |
Псевдокод
dfs() for всех смежных с if - обратное ребро if вершина - белая dfs(u) if ребро - мост
Смотри также
- Обход в глубину
- Использование обхода в глубину для поиска точек сочленения
- Построение компонент вершинной двусвязности
- Построение компонент реберной двусвязности
- Визуализация поиска мостов
Источники
Литература
Седжвик Роберт. Фундаментальные алгоритмы на C++. Часть 5: Алгоритмы на графах: Пер. с англ./Роберт Седжвик. — СПб.: ООО «ДиаСофтЮП», 2002. — С. 123-128