Недавно я провел некоторое исследование алгоритмов Prims/Kruskals для поиска минимальных остовных деревьев на графиках, и меня интересует следующая проблема :Алгоритм поиска минимального связующего дерева для графа с весами ребер в {1,2,3}
Пусть G - неориентированный граф на n вершин с m ребрами, так что каждое ребро имеет вес w (e) ∈ {1, 2, 3}. Существует ли алгоритм, который находит минимальное остовное дерево G во времени O (n + m)?
Очевидно, что вы можете просто запустить Prims на графике, и вы получите минимальное остовное дерево, но не в требуемое время.
Я думал, что мы можем начать с добавления каждого края с весом 1 к дереву при условии, что он не создает циклов, как если бы был край веса 1, который не создает циклов, тогда предпочтительнее край вес 2 говорят, и делайте это в порядке возрастания.
Любая помощь по возможным способам разработки алгоритма для этого была бы оценена, и любые реализации (желательно Java, но любой язык приветствуется) были бы очень полезны.
Благодарим вас за это. Теперь я понял, что могу просто адаптировать Kruskals и иметь следующее: Использование структуры данных Union-Find (Disjoint-set): Для всех v в V, MAKE_SET (v); Сортируйте края в неупорядоченном порядке на 3 ковши (каждый ковш соответствует определенному весу); Для каждого ребра (u, v) в E, начиная с тех в ковше 1 (то есть в неубывающем порядке) { , если FIND (u)! = FIND (v), то T = T U (u, v); UNION (u, v); } Возврат T – mathcomp
Выполняется ли это в O (m + n) времени? Если нет, можете ли вы помочь, когда я ошибаюсь/предоставляю некоторый псевдокод? Извините, если я не понимаю – mathcomp
Он работает в O (alpha (m)) времени. Для любой цели в известной вселенной альфа (м) <5 м. Так что на практике это O (m). Ваше описание в порядке. «Сортировка» не в обычном смысле. Это один проход через элементы, каждый из которых привязывает правое ведро в постоянное время. @mathcomp – Gene