Использование обхода в глубину для поиска мостов — различия между версиями
Grechko (обсуждение | вклад) |
Grechko (обсуждение | вклад) |
||
Строка 4: | Строка 4: | ||
== Алгоритм == | == Алгоритм == | ||
+ | === Теория === | ||
{{Теорема | {{Теорема | ||
|statement= | |statement= | ||
Строка 14: | Строка 15: | ||
Пусть существует удовлетворяющее условию обратное ребро <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> и не может быть мостом. | ||
}} | }} | ||
− | === Функция <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(v)</tex> <br> | ||
Строка 40: | Строка 41: | ||
Так как вершина <tex>u</tex> - потомок <tex>v</tex>, то обратное ребро из ее поддерева является обратным ребром из поддерева <tex>v</tex> <br> | Так как вершина <tex>u</tex> - потомок <tex>v</tex>, то обратное ребро из ее поддерева является обратным ребром из поддерева <tex>v</tex> <br> | ||
}} | }} | ||
+ | |||
+ | === Псевдокод === | ||
+ | '''dfs'''(<tex>v, p</tex>) | ||
+ | <tex> time \leftarrow time + 1</tex> | ||
+ | <tex>enter[v] \leftarrow time</tex> | ||
+ | <tex>ret[v] \leftarrow time </tex> | ||
+ | '''for''' всех <tex>u</tex> смежных с <tex>v</tex> | ||
+ | ''if'' <tex>u = p</tex> '''continue''' |
Версия 10:54, 8 декабря 2010
Содержание
Постановка задачи
Дан неориентированный граф
. Найти все мосты в за времяАлгоритм
Теория
Теорема: |
Пусть - дерево обхода в глубину графа . Ребро является мостом тогда и только тогда, когда и из вершины и любого ее потомка нет обратного ребра в вершину или предка |
Доказательство: |
|
Функция
Определим функцию
, где - потомок
, где - обратное ребро, а - потомок (в нестрогом смысле)
Лемма: |
Ребро является ребром тогда и только тогда, когда принадлежит дереву обхода в глубину и |
Доказательство: |
Так как на пути от вершины к корню дерева величины | убывают, то возвращает величину для ближайшей к корню вершины, достижимой из или ее потомка, возможно используя одно обратное ребро. Следовательно, из вершины или ее потомков существует обратное ребро потомка или саму тогда и только тогда, когда . По доказанной теореме, отсутствие такого ребра эквивалентно тому что - мост.
Лемма: |
|
Доказательство: |
1) |
Псевдокод
dfs() for всех смежных с if continue