
Обхід графів
При розгляді простих (тобто без петель і кратних ребер) неорієнтованих графів часто виникає задача обходу всіх вершин, під час якого ці вершини треба занумерувати.
З обходом вершин графа пов’язано поняття каркасу графа.
Каркасом
(ще кажуть: каркасним деревом, остовним
підграфом, остовом) графа
називається підграф
без циклів, який містить всі вершини V
і максимально можливу кількість ребер.
Якщо граф зв’язний, то його каркас є
деревом; якщо ж граф має k
компонент зв’язності, то його каркас
містить k
дерев.
Граф може мати один або кілька каркасів. Два каркаси того самого графа вважаються різними, якщо вони відрізняються хоча б одним ребром. Необхідною й достатньою умовою того, щоб граф мав більше одного каркасу, є наявність у графі хоч би одного циклу.
Кількість
різних каркасів простого зв’язного
графа можна визначити за матрицею
Кірхгофа
.
Рядки і стовпчики цієї матриці, як і
матриці суміжності, позначають елементами
множини вершин V.
При цьому
дорівнює степеневі вершини
;
,
якщо вершини
і
суміжні;
,
якщо вершини
і
не суміжні. У такій матриці сума елементів
кожного рядка, а також кожного стовпчика
дорівнює нулеві, а алгебраїчні доповнення
всіх елементів рівні.
Теорема (Кірхгофа, 1847). Кількість каркасів простого неорієнтованого зв’язного графа дорівнює алгебраїчному доповненню будь-якого елемента матриці Кірхгофа.
Алгоритми обходу вершин графа називають методами пошуку. Розглянемо пошук вглиб і вшир.
Нехай дано простий зв’язний неорієнтований граф .
В алгоритмі пошуку вглиб використовується стек, який працює за принципом LIFO (last in — first out), тобто додавання й вилучення елементів стеку відбувається з одного кінця — верхівки стеку.
Для простого зв’язного неорієнтованого графа алгоритм пошуку вглиб передбачає таку послідовність кроків.
К1. Довільній вершині v присвоюємо номер 1 і записуємо позначку цієї вершини в стек;
К2. Нехай у верхівці стеку є вершина . Якщо всі ребра, інцидентні вершині , позначено, то переходимо на К4, інакше — на К3;
К3. Нехай — непозначене ребро. Якщо вершині номер присвоєно, то ребро позначаємо, наприклад, пунктиром (- - -) і переходимо на К2. Якщо вершині номер не присвоєно, то присвоюємо їй поточний номер і записуємо її позначку в стек; ребро позначаємо, наприклад, суцільною товстою лінією (——) і переходимо на К2.
К4. Виключаємо з верхівки стеку позначку вершини . Якщо стек порожній, то каркас побудовано (його вершини перенумеровано, а ребра позначено суцільною товстою лінією); інакше переходимо на К2.
В алгоритмі пошуку вшир використовується список-черга, яка працює за принципом FIFO (first in — first out), тобто елементи додаються в хвіст черги, а вилучаються з голови. При виборі вершин з голови розглядаються всі ще не занумеровані її сусіди.
Для простого зв’язного неорієнтованого графа алгоритм пошуку вшир передбачає таку послідовність кроків.
К1. Довільній вершині v присвоюємо номер 1 і записуємо позначку цієї вершини в чергу;
К2. Нехай на початку черги є позначка вершини . Якщо всі ребра, інцидентні вершині , позначено, то переходимо на К4, інакше — на К3;
К3. Нехай — непозначене ребро. Якщо вершині номер присвоєно, то ребро позначаємо, наприклад, пунктиром (- - -) і переходимо на К2. Якщо вершині номер не присвоєно, то присвоюємо їй поточний номер і записуємо її позначку в чергу; ребро позначаємо, наприклад, суцільною товстою лінією (——) і переходимо на К2.
К4. Вилучаємо з початку черги позначку вершини . Якщо черга порожня, то каркас побудовано (його вершини перенумеровано, а ребра позначено суцільною товстою лінією); інакше переходимо на К2.
Роботу алгоритмів пошуку вглиб і вшир зручно подавати за допомогою таблиці з чотирма колонками: вершина — інцидентне ребро, номер вершини, стек чи черга, коментар.
Приклад. Дано простий зв’язний неорієнтований граф:
Визначити, скільки каркасів має цей граф, і побудувати його каркаси, використовуючи методи пошуку вглиб і вшир.
Розв’язання. Щоб визначити, скільки каркасів має даний граф, побудуємо для нього матрицю Кірхгофа:
і знайдемо
алгебраїчне доповнення, наприклад,
елемента
(вибір цього елемента зумовлено тим, що
відповідний визначник можна легко
порахувати):
.
Отже, заданий граф має 3 різні каркаси.
Побудуємо каркас графа, використовуючи метод пошуку вглиб.
Початковою виберемо вершину а. Протокол обходу графа подамо в таблиці:
Вершина — інцидентне ребро |
Номер вершини |
Стек
|
Коментар (пошук вглиб) |
а |
1 |
а |
К1 — вибираємо вершину а, їй присвоюємо номер 1, позначку а записуємо в стек. |
b — (a, b) |
2 |
ab |
К2 — у верхівці стеку вершина а; К3 —вибираємо інцидентне вершині а ребро (a, b); вершина b не має номера, присвоюємо їй номер 2 і позначку b записуємо в стек; (a, b) позначаємо — . |
c — (b, c) |
3 |
abс |
К2 — у верхівці стеку вершина b; К3 — вибираємо інцидентне вершині b ребро (b, c); вершина с не має номера, присвоюємо їй номер 3 і позначку с записуємо в стек; (b, c) позначаємо — . |
— |
— |
ab |
К2 — у верхівці стеку вершина с, єдине інцидентне їй ребро (b, c) вже позначено; К4 — вилучаємо з верхівки стеку елемент с. |
d — (b, d) |
4 |
abd |
К2 — у верхівці стеку вершина b; К3 — вибираємо інцидентне вершині b ребро (b, d); вершина d не має номера, присвоюємо їй номер 4 і позначку d записуємо в стек; (b, d) позначаємо — . |
e — (d, e) |
5 |
abde |
К2 — у верхівці стеку вершина d; К3 — вибираємо інцидентне вершині d ребро (d, e); вершина e не має номера, присвоюємо їй номер 5 і позначку e записуємо в стек; (d, e) позначаємо — . |
b — (e, b) |
— |
abde |
К2 — у верхівці стеку вершина е; К3 — вибираємо інцидентне вершині d ребро (e, b); вершина b має номер, тому (e, b) позначаємо - - -, а вміст стеку не змінюємо. |
— |
— |
abd |
К2 — у верхівці стеку вершина e; ребра, інцидентні вершині e, позначено; К4 — вилучаємо з верхівки стеку елемент e. |
— |
— |
ab |
К2 — у верхівці стеку вершина d; ребра, інцидентні вершині d, позначено; К4 — вилучаємо з верхівки стеку елемент d. |
— |
— |
a |
К2 — у верхівці стеку вершина b; ребра, інцидентні вершині b, позначено; К4 — вилучаємо з верхівки стеку елемент b. |
— |
— |
X |
К2 — у верхівці стеку вершина a; ребра, інцидентні вершині a, позначено; К4 — вилучаємо з верхівки стеку елемент a; стек став порожнім. Отже, каркас побудовано. |
Побудований каркас має вигляд:
Тепер побудуємо каркас графа, використовуючи метод пошуку вшир.
Виберемо початковою вершину а. Послідовність обходу графа подамо в таблиці:
Вершина — інцидентне ребро |
Номер вершини |
|
Коментар (пошук вшир) |
а |
1 |
а |
К1 — вибираємо вершину а, їй присвоюємо номер 1, позначку а записуємо в чергу. |
b — (a, b) |
2 |
ab |
К2 — на початку черги вершина а; К3 —вибираємо інцидентне вершині а ребро (a, b); вершина b не має номера, присвоюємо їй номер 2 і позначку b записуємо в кінець черги; (a, b) позначаємо — . |
— |
— |
b |
К2 — на початку черги вершина а; єдине інцидентне їй ребро (а, b) вже позначено; К4 — вилучаємо з початку черги елемент а. |
с — (b, с) |
3 |
bс |
К2 — на початку черги вершина b; К3 — вибираємо інцидентне вершині b ребро (b, с); вершина с не має номера, присвоюємо їй номер 3 і позначку с записуємо в кінець черги; (b, с) позначаємо — . |
d — (b, d) |
4 |
bcd |
К2 — у верхівці стеку вершина b; К3 — вибираємо інцидентне вершині b ребро (b, d); вершина d не має номера, присвоюємо їй номер 4 і позначку d записуємо в стек; (b, d) позначаємо — . |
e — (b, e) |
5 |
bсde |
К2 — на початку черги вершина b; К3 — вибираємо інцидентне вершині b ребро (b, e); вершина e не має номера, присвоюємо їй номер 5 і позначку e записуємо в кінець черги; (b, e) позначаємо — . |
— |
— |
cde |
К2 — на початку черги вершина b; усі інцидентні їй ребра вже позначено; К4 — вилучаємо з початку черги елемент b. |
— |
— |
de |
К2 — на початку черги вершина c; єдине інцидентне їй ребро (b, c) вже позначено; К4 — вилучаємо з початку черги елемент c. |
е — (d, е) |
— |
de |
К2 — на початку черги вершина d; К3 — інцидентне їй ребро (d, е) ще не позначене, але вершині е вже присвоєно номер 5, тому (d, е) позначаємо - - -, а вміст черги не змінюємо. |
— |
— |
e |
К2 — на початку черги вершина d; усі інцидентні їй ребра вже позначено; К4 — вилучаємо з початку черги елемент d. |
— |
— |
X |
К2 — на початку черги вершина e; усі інцидентні їй ребра вже позначено; К4 — вилучаємо з початку черги елемент e; черга стала порожньою. Отже, каркас побудовано. |
Побудований каркас має вигляд: