Попередній відповідь вказує алгоритм , щоб визначити , чи є кілька MSTS, які, для кожного ребра не в G , знайти цикл , створений шляхом додавання е до передвичесленням MST і перевірити , якщо адреса не єдиний важкий край в цьому циклі. Цей алгоритм, ймовірно, працює в O ( | E | | V | ) час.eGeeO(|E||V|)
Більш простий алгоритм , щоб визначити , чи є кілька MSTS з G в час складністьO(|E|log(|V|)) .
1. Запустіть алгоритм Крускала на щоб знайти MST m .Gm
2. Спробуйте запустити алгоритм Kruskal на ще раз. Під час цього виконання, коли ми маємо вибір серед ребер рівної ваги, спершу спробуємо ребра не в m , після чого спробуємо ребра в m . Кожного разу, коли ми знайшли ребро, не в m, з'єднує два різних дерева, ми стверджуємо, що існує кілька MST, що припиняють алгоритм.Gmmm
3. Якщо ми досягли тут, то ми стверджуємо, що має унікальний MST.G
Звичайний запуск алгоритму Крускала займає час . Додатковий вибір ребер не в m може бути здійснений за O ( | E | ) час. Так алгоритм досягає часової складності O ( | E | log ( | V | ) ) .O(|E|log(|V|))mO(|E|)O(|E|log(|V|))
Чому цей алгоритм може визначити, чи існує кілька MST?
Припустимо, у нас є MST що не збігається з m . Досить показати, що алгоритм, що працює на G , не досягне кроку 3, оскільки край, знайдений в кінці кроку 2, який не знаходиться в m, і з'єднує два різні дерева, був би включений в отриманий MST, якби ми запускали Крускал алгоритм до завершення. Нехай w - найбільша вага такої, що для будь-якого ребра, що важить менше w , він знаходиться в m, якщо і тільки якщо він знаходиться в m ′ . Тому що m і m ′ w, які знаходяться в m ′, але не в mm′mGmwwmm′mm′ мають однакову кількість ребер ваги w , існують краї вагиwm′m . Якщо алгоритм завершився обробкою країв цих ребер, ми закінчили. В іншому випадку, припустимо, що алгоритм зараз обробляє перший край серед цих ребер. Нехай S - сукупність усіх ребер, які збереглися до цього часу, для включення в отриманий MST. S ⊂ м . Оскільки алгоритм не закінчив обробку краю ваги w не в m, такому як e ' , він, мабуть, не почав обробку країв вагою w в м . Так ребра в Se′SS⊂mwme′wmSважать менше, ніж . Це означає S ⊂ m ′ . Нагадаємо, що e повинно з'єднати два різних дерева в S, і алгоритм виходить у цій точці.wS⊂m′. Є в m ′ . Оскільки { e ′ } ∪ S ⊂ m ′ , де m ′ - дерево, e ′e′m′{e′}∪S⊂m′m′e′S
Примітка щодо подальшої розробки.
Крок 1 і крок 2 можна переплести, щоб ми могли якомога швидше скасувати алгоритм без обробки країв більшої ваги.
Якщо ви хочете обчислити кількість MST, ви можете перевірити відповідь на те, як обчислити кількість MST .