Близько року тому ми з другом придумали спосіб реалізувати алгоритм Крускала для щільних графіків у кращій формі, ніж звичайний пов'язаний (не передбачаючи попередньо відсортованих ребер). Зокрема, ми досягаємо у всіх випадках, подібних до Prim, коли реалізуються за допомогою матриць суміжності.
Я написав трохи про алгоритм у своєму блозі , включаючи код C ++ та орієнтири, але ось загальна ідея:
Підтримуйте один представницький вузол для кожного підключеного компонента. Спочатку всі вузли представляють себе.
Підтримуйте вектор
dist[i]
таким, що для кожного компонентаi
має найлегший край, що стикається з перетином компонентаi
.Знайшовши найлегший край, який перетинає перегородки, просто знайдіть,
i
що мінімізує вагуdist[i]
, за лінійний час.
Таким чином, стиснення найлегшого краю і знаходження згаданого краю може бути здійснено за лінійний час. Робимо це раз, щоб знайти MST. Потрібно трохи бухгалтерії, щоб фактично знайти, який край ми хочемо додати до MST, але це не збільшує складність. Таким чином, час виконання - . Реалізація - це лише пара циклів.
Чи відома ця версія Крускала в літературі?