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