Около года назад мы с другом подумали, как реализовать алгоритм Крускала для плотных графов лучше, чем обычная граница (без учета предварительно отсортированных ребер). В частности, мы достигаем во всех случаях, аналогично Prim, когда реализованы с использованием матриц смежности.
Я опубликовал немного об алгоритме в своем блоге , включая код на C ++ и тесты, но вот общая идея:
Поддерживать один репрезентативный узел для каждого подключенного компонента. Первоначально все узлы представляют себя.
Поддерживайте вектор
dist[i]
таким образом, чтобы для каждого компонентаi
имелся самый легкий край пересечения компонента, падающий наi
.При нахождении самого легкого края, который пересекает перегородки, просто найдите,
i
который минимизирует весdist[i]
в линейном времени.При объединении двух компонентов и измените матрицу смежности , чтобы теперь для всех компонентов k , и отметьте i больше не является представителем его подключенного компонента ( теперь останется только j ).
Таким образом, сжатие самого легкого края и обнаружение указанного края могут быть выполнены за линейное время. Мы делаем это раз, чтобы найти MST. Небольшая бухгалтерия необходима для того, чтобы на самом деле определить, какое преимущество мы хотим добавить к MST, но это не увеличивает сложность. Таким образом, среда выполнения является . Реализация это всего лишь пара циклов for.
Известна ли эта версия Крускала в литературе?