Использование обхода в глубину для поиска мостов — различия между версиями
Grechko (обсуждение | вклад) |
|||
Строка 17: | Строка 17: | ||
==== Функция <tex>ret(v)</tex> ==== | ==== Функция <tex>ret(v)</tex> ==== | ||
Определим функцию <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(x)</tex>, где <tex>x</tex> - потомок <tex>v</tex> <br> | + | * <tex>enter(v)</tex> <br> |
− | <tex>enter(x)</tex>, где <tex>(w, x)</tex> - обратное ребро, а <tex>w</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> | ||
+ | |||
{{Лемма | {{Лемма | ||
|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> | ||
Строка 29: | Строка 31: | ||
{{Лемма | {{Лемма | ||
|statement = | |statement = | ||
− | <tex>ret(v)</tex> = | + | <tex>ret(v)</tex> = <tex>min(</tex> <br> |
− | <tex>enter(v) </tex> <br> | + | * <tex>enter(v) </tex> <br> |
− | <tex>enter(p)</tex>, <tex>(v, p)</tex> - обратное ребро <br> | + | * <tex>enter(p)</tex>, <tex>(v, p),</tex> - обратное ребро <br> |
− | <tex>ret(u)</tex>, <tex>(v, u)</tex> - ребро дерева | + | * <tex>ret(u)</tex>, <tex>(v, u)</tex> - ребро дерева |
+ | <tex>) </tex> | ||
|proof = | |proof = | ||
1)<tex>enter(v) </tex> <br> | 1)<tex>enter(v) </tex> <br> |
Версия 01:27, 9 декабря 2010
Содержание
Постановка задачи
Дан неориентированный граф
. Найти все мосты в за времяАлгоритм
Теория
Теорема: |
Пусть - дерево обхода в глубину графа . Ребро является мостом тогда и только тогда, когда и из вершины и любого ее потомка нет обратного ребра в вершину или предка |
Доказательство: |
|
Функция
Определим функцию
Лемма: |
Ребро является ребром тогда и только тогда, когда принадлежит дереву обхода в глубину и |
Доказательство: |
Так как на пути от вершины к корню дерева величины | убывают, то возвращает величину для ближайшей к корню вершины, достижимой из или ее потомка, возможно используя одно обратное ребро. Следовательно, из вершины или ее потомков существует обратное ребро потомка или саму тогда и только тогда, когда . По доказанной теореме, отсутствие такого ребра эквивалентно тому что - мост.
Лемма: |
|
Доказательство: |
1) |
Псевдокод
dfs() for всех смежных с if - обратное ребро if вершина - белая dfs(u) if ребро - мост