Использование обхода в глубину для поиска мостов — различия между версиями
Niko (обсуждение | вклад) |
Niko (обсуждение | вклад) |
||
Строка 1: | Строка 1: | ||
== Постановка задачи == | == Постановка задачи == | ||
− | Дан неориентированный граф <tex> G </tex>. Найти все мосты в <tex> G </tex> за время <tex> O(|V| + |E|)</tex> | + | Дан неориентированный [[Основные определения теории графов#Граф| граф]] <tex> G </tex>. Найти все [[Мост, эквивалентные определения | мосты]] в <tex> G </tex> за время <tex> O(|V| + |E|)</tex> |
== Алгоритм == | == Алгоритм == | ||
{{Теорема | {{Теорема | ||
|statement= | |statement= | ||
− | Пусть <tex> T </tex> - дерево обхода в глубину графа <tex> G</tex>. Ребро <tex> (u, v) </tex> является мостом тогда и только тогда, когда <tex> (u, v) \in T</tex> и из вершины <tex> v</tex> и любого ее потомка нет обратного ребра в вершину <tex> u</tex> или предка <tex> u </tex> | + | Пусть <tex> T </tex> - дерево [[Обход в глубину, цвета вершин | обхода в глубину графа]] <tex> G</tex>. Ребро <tex> (u, v) </tex> является мостом тогда и только тогда, когда <tex> (u, v) \in T</tex> и из вершины <tex> v</tex> и любого ее потомка нет обратного ребра в вершину <tex> u</tex> или предка <tex> u </tex> |
|proof= | |proof= | ||
<tex> \Leftarrow</tex> <br> | <tex> \Leftarrow</tex> <br> |
Версия 07:46, 22 октября 2011
Содержание
Постановка задачи
Дан неориентированный граф . Найти все мосты в за время
Алгоритм
Теорема: |
Пусть обхода в глубину графа . Ребро является мостом тогда и только тогда, когда и из вершины и любого ее потомка нет обратного ребра в вершину или предка - дерево |
Доказательство: |
|
Функция
Определим функцию
- время входа в вершину
-
-
Лемма: |
Ребро является мостом тогда и только тогда, когда принадлежит дереву обхода в глубину и |
Доказательство: |
Так как на пути от вершины к корню дерева величины | убывают, то возвращает величину для ближайшей к корню вершины, достижимой из или ее потомка, возможно используя одно обратное ребро. Следовательно, из вершины или ее потомков существует обратное ребро потомка или саму тогда и только тогда, когда . По доказанной теореме, отсутствие такого ребра эквивалентно тому что - мост.
Утверждение: |
|
1) |
Псевдокод
dfs() for всех смежных с if - обратное ребро if вершина - белая dfs(u) if ребро - мост
Смотри также
- Обход в глубину
- Использование обхода в глубину для поиска точек сочленения
- Построение компонент вершинной двусвязности
- Построение компонент реберной двусвязности
- Визуализация поиска мостов
Источники
Литература
Седжвик Роберт. Фундаментальные алгоритмы на C++. Часть 5: Алгоритмы на графах: Пер. с англ./Роберт Седжвик. — СПб.: ООО «ДиаСофтЮП», 2002. — С. 123-128