Использование обхода в глубину для поиска мостов — различия между версиями
(→Псевдокод) |
м (rollbackEdits.php mass rollback) |
||
(не показаны 4 промежуточные версии 4 участников) | |||
Строка 17: | Строка 17: | ||
* <tex>enter(v)</tex> [[Использование обхода в глубину для топологической сортировки | время входа в вершину <tex>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( | + | * <tex>enter(w)</tex>, где <tex>(w, x)</tex> — обратное ребро, а <tex>w</tex> — потомок <tex>v</tex> (в нестрогом смысле) <br> |
===Лемма=== | ===Лемма=== | ||
Строка 40: | Строка 40: | ||
=== Псевдокод === | === Псевдокод === | ||
− | '''function''' dfs(v) | + | '''function''' dfs(v): |
time = time + 1 | time = time + 1 | ||
enter[v] = time | enter[v] = time | ||
Строка 46: | Строка 46: | ||
'''for''' всех u смежных с v | '''for''' всех u смежных с v | ||
'''if''' (v, u) — обратное ребро | '''if''' (v, u) — обратное ребро | ||
− | ret[v] = | + | ret[v] = min(ret[v], enter[u]) |
'''if''' вершина u — белая | '''if''' вершина u — белая | ||
dfs(u) | dfs(u) | ||
− | ret[v] = | + | ret[v] = min(ret[v], ret[u]) |
'''if''' ret[u] > enter[v] | '''if''' ret[u] > enter[v] | ||
ребро (v, u) — мост | ребро (v, u) — мост |
Текущая версия на 19:12, 4 сентября 2022
Дан неориентированный граф . Найти все мосты в за время
Содержание
Алгоритм
Теорема: |
Пусть обхода в глубину графа . Ребро является мостом тогда и только тогда, когда и из вершины и любого ее потомка нет обратного ребра в вершину или предка — дерево |
Доказательство: |
|
Функция
Определим функцию
- время входа в вершину
-
-
Лемма
Лемма: |
Ребро является мостом тогда и только тогда, когда принадлежит дереву обхода в глубину и |
Доказательство: |
Рассмотрим вершину Таким образом, если для текущего ребра или её потомка. Из нее есть обратное ребро в предка тогда и только тогда, когда найдется такой сын , что . Если , то найдется обратное ребро, приходящее точно в . Если же , то это означает наличие обратного ребра в какого-либо предка вершины . (принадлежащего дереву поиска) выполняется , то это ребро является мостом; в противном случае оно мостом не является. |
Утверждение: |
— обратное ребро, — ребро дерева |
|
Псевдокод
function dfs(v): time = time + 1 enter[v] = time ret[v] = time for всех u смежных с v if (v, u) — обратное ребро ret[v] = min(ret[v], enter[u]) if вершина u — белая dfs(u) ret[v] = min(ret[v], ret[u]) if ret[u] > enter[v] ребро (v, u) — мост
См. также
Источники информации
- MAXimal :: algo :: Поиск мостов
- Wikipedia — Bridge
- Визуализация поиска мостов
- Седжвик Р. Фундаментальные алгоритмы на C++. Часть 5: Алгоритмы на графах. Пер. с англ. — СПб.: ООО «ДиаСофтЮП», 2002. — С. 123-128