Использование обхода в глубину для поиска мостов — различия между версиями
Niko (обсуждение | вклад) (→Источники) |
Niko (обсуждение | вклад) |
||
Строка 10: | Строка 10: | ||
Удалим <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> <br> | Удалим <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> <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> и не может быть мостом. | ||
}} | }} | ||
Строка 16: | Строка 15: | ||
Определим функцию <tex>ret(v)</tex>, где <tex>v \in V</tex>, как минимум из следущих величин <br> | Определим функцию <tex>ret(v)</tex>, где <tex>v \in V</tex>, как минимум из следущих величин <br> | ||
− | * <tex>enter(v)</tex> <br> | + | * <tex>enter(v)</tex> [[Использование обхода в глубину для топологической сортировки | время входа в вершину <tex>v </tex> ]] <br> |
* <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> | ||
Строка 27: | Строка 26: | ||
− | {{ | + | {{Утверждение |
|statement = | |statement = | ||
<tex>ret(v)</tex> = <tex>min(</tex> <br> | <tex>ret(v)</tex> = <tex>min(</tex> <br> | ||
Строка 35: | Строка 34: | ||
<tex>) </tex> | <tex>) </tex> | ||
|proof = | |proof = | ||
− | [[Файл:Bridges_nv.png| | + | [[Файл:Bridges_nv.png|300px|thumb|right|В скобах у вершины <tex>u</tex> указаны <tex>enter[u]</tex> и <tex>ret[u]</tex>. Мостами будут красные красный]] |
1)<tex>enter(v) </tex> <br> | 1)<tex>enter(v) </tex> <br> | ||
По определению функции <tex>ret</tex> <br> | По определению функции <tex>ret</tex> <br> | ||
Строка 71: | Строка 70: | ||
==Литература== | ==Литература== | ||
Седжвик Роберт. Фундаментальные алгоритмы на C++. Часть 5: Алгоритмы на графах: Пер. с англ./Роберт Седжвик. — СПб.: ООО «ДиаСофтЮП», 2002. — С. 123-128 | Седжвик Роберт. Фундаментальные алгоритмы на C++. Часть 5: Алгоритмы на графах: Пер. с англ./Роберт Седжвик. — СПб.: ООО «ДиаСофтЮП», 2002. — С. 123-128 | ||
+ | |||
+ | [[Категория: Алгоритмы и структуры данных]] | ||
+ | [[Категория: Обход в глубину]] |
Версия 07:16, 22 октября 2011
Содержание
Постановка задачи
Дан неориентированный граф
. Найти все мосты в за времяАлгоритм
Теорема: |
Пусть - дерево обхода в глубину графа . Ребро является мостом тогда и только тогда, когда и из вершины и любого ее потомка нет обратного ребра в вершину или предка |
Доказательство: |
|
Функция
Определим функцию
- время входа в вершину
-
-
Лемма: |
Ребро является мостом тогда и только тогда, когда принадлежит дереву обхода в глубину и |
Доказательство: |
Так как на пути от вершины к корню дерева величины | убывают, то возвращает величину для ближайшей к корню вершины, достижимой из или ее потомка, возможно используя одно обратное ребро. Следовательно, из вершины или ее потомков существует обратное ребро потомка или саму тогда и только тогда, когда . По доказанной теореме, отсутствие такого ребра эквивалентно тому что - мост.
Утверждение: |
|
1) |
Псевдокод
dfs() for всех смежных с if - обратное ребро if вершина - белая dfs(u) if ребро - мост
Смотри также
- Обход в глубину
- Использование обхода в глубину для поиска точек сочленения
- Построение компонент вершинной двусвязности
- Построение компонент реберной двусвязности
- Визуализация поиска мостов
Источники
Литература
Седжвик Роберт. Фундаментальные алгоритмы на C++. Часть 5: Алгоритмы на графах: Пер. с англ./Роберт Седжвик. — СПб.: ООО «ДиаСофтЮП», 2002. — С. 123-128