Использование обхода в глубину для поиска мостов — различия между версиями
(→Источники информации) |
(→Лемма) |
||
| Строка 34: | Строка 34: | ||
|proof = | |proof = | ||
[[Файл:Bridges_dfs.png|300px|thumb|right|В скобах у вершины <tex>u</tex> указаны <tex>enter[u]</tex> и <tex>ret[u]</tex>. Мостами будут красные ребра]] | [[Файл:Bridges_dfs.png|300px|thumb|right|В скобах у вершины <tex>u</tex> указаны <tex>enter[u]</tex> и <tex>ret[u]</tex>. Мостами будут красные ребра]] | ||
| − | + | #<tex>enter(v) </tex> <br>По определению функции <tex>ret</tex> <br> | |
| − | По определению функции <tex>ret</tex> <br> | + | #<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>ret(u)</tex>, <tex>u</tex> — потомок <tex>v</tex> <br>Так как вершина <tex>u</tex> — потомок <tex>v</tex>, то обратное ребро из ее поддерева является обратным ребром из поддерева <tex>v</tex> <br> | |
| − | <tex>p</tex> достижима из <tex>v</tex> по одному обратному ребру, значит величина <tex>ret(v)</tex> не больше <tex>enter(p)</tex> <br> | ||
| − | |||
| − | Так как вершина <tex>u</tex> — потомок <tex>v</tex>, то обратное ребро из ее поддерева является обратным ребром из поддерева <tex>v</tex> <br> | ||
}} | }} | ||
Версия 12:51, 4 января 2016
Дан неориентированный граф . Найти все мосты в за время
Содержание
Алгоритм
| Теорема: |
Пусть — дерево обхода в глубину графа . Ребро является мостом тогда и только тогда, когда и из вершины и любого ее потомка нет обратного ребра в вершину или предка |
| Доказательство: |
|
|
Функция
Определим функцию , где , как минимум из следущих величин
- время входа в вершину
- , где — потомок
- , где — обратное ребро, а — потомок (в нестрогом смысле)
Лемма
| Лемма: |
Ребро является мостом тогда и только тогда, когда принадлежит дереву обхода в глубину и |
| Доказательство: |
|
Рассмотрим вершину или её потомка. Из нее есть обратное ребро в предка тогда и только тогда, когда найдется такой сын , что . Если , то найдется обратное ребро, приходящее точно в . Если же , то это означает наличие обратного ребра в какого-либо предка вершины . Таким образом, если для текущего ребра (принадлежащего дереву поиска) выполняется , то это ребро является мостом; в противном случае оно мостом не является. |
| Утверждение: |
= , ,
, где — обратное ребро, — ребро дерева |
|
Псевдокод
dfs() for всех смежных с if — обратное ребро if вершина — белая dfs(u) if ребро — мост
См. также
Источники информации
- MAXimal :: algo :: Поиск мостов
- Wikipedia — Bridge
- Визуализация поиска мостов
- Седжвик Р. Фундаментальные алгоритмы на C++. Часть 5: Алгоритмы на графах. Пер. с англ. — СПб.: ООО «ДиаСофтЮП», 2002. — С. 123-128