2016-02-25 2 views
0

Недавно я провел некоторое исследование алгоритмов Prims/Kruskals для поиска минимальных остовных деревьев на графиках, и меня интересует следующая проблема :Алгоритм поиска минимального связующего дерева для графа с весами ребер в {1,2,3}

Пусть G - неориентированный граф на n вершин с m ребрами, так что каждое ребро имеет вес w (e) ∈ {1, 2, 3}. Существует ли алгоритм, который находит минимальное остовное дерево G во времени O (n + m)?

Очевидно, что вы можете просто запустить Prims на графике, и вы получите минимальное остовное дерево, но не в требуемое время.

Я думал, что мы можем начать с добавления каждого края с весом 1 к дереву при условии, что он не создает циклов, как если бы был край веса 1, который не создает циклов, тогда предпочтительнее край вес 2 говорят, и делайте это в порядке возрастания.

Любая помощь по возможным способам разработки алгоритма для этого была бы оценена, и любые реализации (желательно Java, но любой язык приветствуется) были бы очень полезны.

ответ

1

Вы описываете незначительную вариацию алгоритма Крускала, которая делает стоимость сортировки по весу O (m) для m ребер, потому что вам нужно всего лишь поместить края в 3 ведра.

Поскольку остальная часть Kruskal's очень близка к O (m) из-за удивительных свойств disjoint set data structure, вы должны быть в хорошей форме.

Построение самого дерева должно быть O (m), а не O (n + m), как ваша цель, потому что нет необходимости обрабатывать вершины. Например. если у вас несколько ребер на вершинах gazillion, большинство из которых не имеют соединения, последним не нужно увеличивать стоимость алгоритма, если вы будете осторожны в дизайне структуры данных.

+0

Благодарим вас за это. Теперь я понял, что могу просто адаптировать 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

+0

Выполняется ли это в O (m + n) времени? Если нет, можете ли вы помочь, когда я ошибаюсь/предоставляю некоторый псевдокод? Извините, если я не понимаю – mathcomp

+0

Он работает в O (alpha (m)) времени. Для любой цели в известной вселенной альфа (м) <5 м. Так что на практике это O (m). Ваше описание в порядке. «Сортировка» не в обычном смысле. Это один проход через элементы, каждый из которых привязывает правое ведро в постоянное время. @mathcomp – Gene

Смежные вопросы