Использование обхода в глубину для поиска мостов
| НЕТ ВОЙНЕ |
|
24 февраля 2022 года российское руководство во главе с Владимиром Путиным развязало агрессивную войну против Украины. В глазах всего мира это военное преступление совершено от лица всей страны, всех россиян. Будучи гражданами Российской Федерации, мы против своей воли оказались ответственными за нарушение международного права, военное вторжение и массовую гибель людей. Чудовищность совершенного преступления не оставляет возможности промолчать или ограничиться пассивным несогласием. Мы убеждены в абсолютной ценности человеческой жизни, в незыблемости прав и свобод личности. Режим Путина — угроза этим ценностям. Наша задача — обьединить все силы для сопротивления ей. Эту войну начали не россияне, а обезумевший диктатор. И наш гражданский долг — сделать всё, чтобы её остановить. Антивоенный комитет России |
| Распространяйте правду о текущих событиях, оберегайте от пропаганды своих друзей и близких. Изменение общественного восприятия войны - ключ к её завершению. |
| meduza.io, Популярная политика, Новая газета, zona.media, Майкл Наки. |
Дан неориентированный граф . Найти все мосты в за время
Содержание
Алгоритм
| Теорема: |
Пусть — дерево обхода в глубину графа . Ребро является мостом тогда и только тогда, когда и из вершины и любого ее потомка нет обратного ребра в вершину или предка |
| Доказательство: |
|
|
Функция
Определим функцию , где , как минимум из следущих величин
- время входа в вершину
- , где — потомок
- , где — обратное ребро, а — потомок (в нестрогом смысле)
Лемма
| Лемма: |
Ребро является мостом тогда и только тогда, когда принадлежит дереву обхода в глубину и |
| Доказательство: |
|
Рассмотрим вершину или её потомка. Из нее есть обратное ребро в предка тогда и только тогда, когда найдется такой сын , что . Если , то найдется обратное ребро, приходящее точно в . Если же , то это означает наличие обратного ребра в какого-либо предка вершины . Таким образом, если для текущего ребра (принадлежащего дереву поиска) выполняется , то это ребро является мостом; в противном случае оно мостом не является. |
| Утверждение: |
= , ,
, где — обратное ребро, — ребро дерева |
|
Псевдокод
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