Шарнір (теорія графів)
Шарніром (англ. articulation point) в теорії графів називається вершина графу, при видаленні якої кількість компонент зв'язності графу зростає.
Визначення
ред.Вершина графу називається шарніром, якщо підграф (граф, що містить якесь підмножина вершин даного графу) , отриманий з графу видаленням вершини і всіх інцидентних їй ребер, складається з більшої кількості компонент зв'язності, ніж вихідний граф .
Ребровим аналогом шарніра є міст. Мостом називається таке ребро графу, в результаті видалення якого кількість компонент зв'язності в графі зростає.
Алгоритм пошуку шарнірів
ред.Ефективне вирішення завдання пошуку всіх шарнірів графу засноване на алгоритмі пошуку у глибину.
Нехай задано граф . Через позначимо множину всіх вершин графу, суміжних з . Припустимо, що ми переглянули граф в глибину, почавши з деякою довільній вершини. Занумеруємо всі вершини графу в тому порядку, в якому ми в них увійшли, і кожній вершині підпорядкуємо відповідний номер . Якщо в вершину ми вперше потрапили з вершини , то вершину будемо називати нащадком , а — предком . Безліч всіх нащадків вершини позначимо через . Через позначимо мінімальний номер серед всіх вершин, суміжних з і з тими вершинами, в які ми прийшли по шляху, що проходить через .
Зрозуміло, що величину можна обчислити рекурсивно, безпосередньо в процесі обходу в глибину: якщо зараз розглядається вершина , і з неї не можна перейти в ще не відвіданих вершину (тобто потрібно повернутися до предку , або припинити обхід, якщо — стартова вершина), то для всіх її нащадків вже пораховано, а значить, і для неї можна можна провести відповідні обчислення за формулою
Знаючи величину для всіх вершин графу, можна визначити всі його шарніри згідно з такими правилами:
- Стартова вершина (тобто та, з якою ми почали обхід) є шарніром тоді і тільки тоді, коли у неї більше одного нащадка.
- Вершина , відмінна від стартової, є шарніром тоді і тільки тоді, коли у неї є нащадок u такий, що .
Як приклад розглянемо застосування описаного алгоритму до графу, зображеному на малюнку справа. Числа, якими позначені вершини, відповідають одному з можливих варіантів обходу в глибину. При такому порядку у кожної з вершин рівно один нащадок, за винятком вершини 6, у якій нащадків немає. Стартова вершина 1 має єдиного нащадка, отже, шарніром вона не є. Для інших вершин обчислимо значення, що цікавить нас функції:
- .
У вершини 2 є нащадок 3, а у 5 нащадок 6 — в обох випадках виконано шукане співвідношення . Отже, 2 і 5 є шарнірами. Інших шарнірів в цьому графі немає.
Псевдокод
ред.GetArticulationPoints(i, d)
visited[i] = true
depth[i] = d
low[i] = d
childCount = 0
isArticulation = false
for each ni in adj[i]
if not visited[ni]
parent[ni] = i
GetArticulationPoints(ni, d + 1)
childCount = childCount + 1
if low[ni] >= depth[i]
isArticulation = true
low[i] = Min(low[i], low[ni])
else if ni <> parent[i]
low[i] = Min(low[i], depth[ni])
if (parent[i] <> null and isArticulation) or (parent[i] == null and childCount > 1)
Output i as articulation point
Див. також
ред.Посилання
ред.- Код на С++, Python та Java для пошуку шарнірів [Архівовано 20 листопада 2016 у Wayback Machine.]