Добавил:
Upload Опубликованный материал нарушает ваши авторские права? Сообщите нам.
Вуз: Предмет: Файл:
ДМ-5-Теорія графів.doc
Скачиваний:
0
Добавлен:
01.03.2025
Размер:
1.49 Mб
Скачать

Обхід графів

При розгляді простих (тобто без петель і кратних ребер) неорієнтованих графів часто виникає задача обходу всіх вершин, під час якого ці вершини треба занумерувати.

З обходом вершин графа пов’язано поняття каркасу графа.

Каркасом (ще кажуть: каркасним деревом, остовним підграфом, остовом) графа називається підграф без циклів, який містить всі вершини 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

К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; черга стала порожньою. Отже, каркас побудовано.

Побудований каркас має вигляд:

Соседние файлы в предмете [НЕСОРТИРОВАННОЕ]