алгоритм Круськала
Інший жадібний алгоритм для задачі про оптимальний каркасі відомий як алгоритм Круськала. У ньому теж на кожному кроці розглядається часткове вирішення. Відмінність від алгоритму Прима полягає в тому, що в алгоритмі Круськала часткове рішення завжди являє собою кістяк ліс графа , Тобто ліс, що складається з усіх вершин графа і деяких його ребер. На початку не містить жодного ребра, тобто складається з ізольованих вершин. Потім до нього послідовно додаються ребра, поки не буде побудований каркас графа . нехай - ліс, побудований до чергового кроку. Ребро графа, що не належить , Назвемо червоним, якщо вершини цього ребра належать одній компоненті зв'язності лісу , І зеленим, якщо вони належать різним компонентам. якщо до додати червоне ребро, то утворюється цикл. Якщо ж до додати зелене ребро, то вийде новий ліс, в якому буде на одну компоненту зв'язності менше, ніж в , Так як в результаті додавання ребра дві компоненти зіллються в одну. Таким чином, до не можна додати ніяке червоне ребро і можна додати будь-зелене. Для вибору додається ребра застосовується той же "жадібний" принцип, що і в алгоритмі Прима - з усіх зелених ребер вибирається ребро найменшої ваги. Для того щоб полегшити пошук цього ребра, спочатку все ребра графа впорядковуються за зростанням ваг: . Тепер послідовність ребер досить переглянути один раз і для чергового розглянутого ребра потрібно тільки вміти визначати, чи є воно червоним або зеленим щодо побудованого до цього моменту лісу . Червоні ребра просто пропускаються, а зелені додаються до .
Для більш формального опису алгоритму зауважимо, що поточний ліс визначає розбиття множини вершин графа на області зв'язності цього лісу: і що червоне ребро - це таке ребро, у якого обидві вершини належать одній частині розбиття. нехай - функція, яка повертає для кожної вершини ім'я тієї частини розбиття, якій належить , а - процедура, яка по іменах і двох частин розбиття будує нове розбиття, замінюючи ці дві частини їх об'єднанням. нехай , . Тоді алгоритм Круськала (після згаданого упорядкування ребер) можна записати в такий спосіб.
Алгоритм 2. Побудова оптимального каркаса методом Круськала
- for to do
- if then ,
Більш докладно алгоритм Круськала розглядається у другій частині (в розділі, присвяченому розділеним безлічам). Коректність цього алгоритму випливає із загальної теореми Радо-Едмондс, яка буде розглянута в "Наступній лекції" .