Добавил:
Upload Опубликованный материал нарушает ваши авторские права? Сообщите нам.
Вуз: Предмет: Файл:
Graph-Alg.doc
Скачиваний:
1
Добавлен:
16.09.2019
Размер:
175.62 Кб
Скачать

Алгоритм Крускала побудови кістякового дерева найменшої вартості

Розглянемо таку задачу. Задано зв’язний скінченний неорієнтований граф G=(V,E), на множині ребер якого визначена функція вартості с (відображення виду с: ER). Якщо eE, назвемо с(e) вартістю ребра e. Вартістю графу назвемо суму вартостей усіх його ребер. Потрібно знайти кістякове дерево графу G, яке має найменшу вартість.

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

Будемо використовувати для подання кістякового лісу S графу G дві множини, ЕТ та VS, де ЕТ – множина ребер кістякового лісу, VS – множина, елементи якої утворюють розбиття множини V, де кожен клас розбиття – це множина усіх вершин деякого компоненту зв’язності кістякового лісу S. При уведенні чергового ребра (u,v) у кістяковий ліс S будемо перевіряти, належать кінці цього ребра одній й тій самій множині W з VS чи ні. Якщо u,vW, то у результаті уведення ребра (u,v) у ліс S матимемо цикл, якщо u,vW, то після уведення (u,v) у S матимемо кістяковий ліс графу G, причому цей ліс буде мати на один компонент зв’язності менше, ніж S. Отже, для уведення у кістяковий ліс підходить лише таке ребро найменшої вартості, кінці якого належать різним множинам з VS. Оскільки граф G скінченний, то зрештою процес побудови послідовності кістякових лісів завершиться, причому буде побудовано кістякове дерево графу G.

Алгоритм Крускала.

1. Надати початкові значення ЕТ та VS: ЕТ:=, VS:=.

2. Побудувати послідовність Q ребер графу G, упорядкувавши їх за неспаданням вартості.

3. Для кожної вершини v графу G побудувати множину {v} та внести {v} у VS.

4. Поки VS має більше, ніж один елемент, виконувати:

4.1) вибрати з Q ребро (u,w) найменшої вартості;

4.2) вилучити (u,w) з Q;

4.3) якщо u та w належать різним множинам W1 та W2 з множини VS, то

4.3.1) замінити W1 та W2 у множині VS на W1W2;

4.3.2) внести ребро (u,w) у множину ЕТ.

5. Кінець.

Даний алгоритм знаходить кістякове дерево найменшої вартості зв’язного графу G, витрачаючи часy не більше, ніж O(|E|log|E|).

Розглянемо приклад. Нехай задано зв’язний граф G=({a,b,c,d,e,f},{(a,b), (a,e),(b,c),(b,f),(c,d),(c,f),(d,e),(d,f),(e,f)}) та функція вартості С на множині його ребер: С(a,b)=3, С(a,e)=5, С(b,c)=6, С(b,f)=7, С(c,d)=4, С(c,f)=4, С(d,e)=3, С(d,f)=4, С(e,f)=5. Застосуємо алгоритм Крускала для побудови кістякового дерева найменшої вартості графу G. Множина ЕТ спочатку порожня (ЕТ:=). Побудуємо множину VS: VS:={{a},{b},{c},{d},{e},{f}}. Упорядкуємо ребра графу G (побудуємо послідовність Q, зазначивши вартість кожного ребра; для цього елементи Q подамо як упорядковані пари виду (ребро, вартість ребра)): Q:=((a,b),3),((d,e),3),((c,f),4),((c,d),4),((d,f),4),((a,e),5),((e,f),5),((b,c),6),((b,f),7).

Тепер почнемо поповнювати множину ЕТ. Виберемо з Q ребро найменшої вартості (тобто ребро (a,b)) й вилучимо його з Q. Нове значення Q: ((d,e),3),((c,f),4),((c,d),4),((d,f),4),((a,e),5),((e,f),5),((b,c),6),((b,f),7). Оскільки кінці реб-ра (a,b) належать різним множинам з VS, замінимо множини {a} та {b} з VS їх об’єднанням {a,b} й обчислимо нове значення VS: VS:={{a,b},{c},{d},{e},{f}}. Внесемо ребро (a,b) у ЕТ: ЕТ:={(a,b)}. Оскільки VS містить більше, ніж один елемент, продовжимо побудову ЕТ. Виберемо з Q ребро найменшої вартості (це ребро (d,e)) й вилучимо його з Q. Нове значення Q:((c,f),4),((c,d),4),((d,f),4), ((a,e),5),((e,f),5),((b,c),6),((b,f),7). Кінці ребра (d,e) знаходяться у різних множинах з VS, отже, замість {d} та {e} уведемо у VS множину {d,e}. Маємо нове значення VS: VS:={{a,b},{c},{d,e},{f}}. Поповнимо ЕТ: ЕТ:={(a,b), (d,e)}. Кількість елементів у множині VS більша одиниці, тому продовжуємо побудову ЕТ. Виберемо з Q реб-ро найменшої вартості (ребро (c,f)) й вилучимо його з Q. Тепер Q=((c,d),4), ((d,f),4),((a,e),5),((e,f),5),((b,c),6),((b,f),7). Кінці ребра (c,f) знаходяться у різних множинах з VS, тому замінимо множини {c} та {f} у VS їх об’єднанням {c,f}. Має-мо: VS:={{a,b},{c,f},{d,e}}, ЕТ:={(a,b),(d,e),(c,f)}. Множина VS містить більше, ніж один елемент, тому знов вибираємо з Q ребро найменшої вартості (ребро (c,d)). Його кінці належать різним множинам з VS, отже, переобчислюємо VS та ЕТ. Маємо: VS:={{a,b},{c,f,d,e}}, ЕТ:={(a,b),(d,e),(c,f),(c,d)}. (Нове значення Q: ((d,f),4), ((a,e),5),((e,f),5),((b,c),6),((b,f),7).) Множина VS містить два елемента, тому виби-раємо з Q ребро найменшої вартості (це ребро (d,f)) та вилучаємо його з Q (нове значення Q: ((a,e),5),((e,f),5),((b,c),6),((b,f),7)). Кінці ребра (d,f) належать одній множині з VS, тому це ребро не можна уводити у ЕТ. Вибираємо знов з Q ребро найменшої вартості (ребро (a,e)). Вилучаємо це ребро з Q (нове значення Q: ((e,f),5),((b,c),6),((b,f),7)). Кінці ребра (a,e) знаходяться у різних множинах з VS, тому переобчислюємо VS та ЕТ. Маємо: VS:={{a,b,c,f,d,e}}, ЕТ:={(a,b),(d,e),(c,f), (c,d),(a,e)}. Тепер множина VS містить один елемент, отже, алгоритм завершує роботу. Побудовано кістякове дерево графу G, а саме: (V,ЕТ). Обчислимо його вартість СТ. Вона дорівнює сумі вартостей усіх ребер дерева, тобто СТ =3+3+4+4+5=19.

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