Sekitar setahun yang lalu, seorang teman dan saya memikirkan cara untuk mengimplementasikan algoritma Kruskal untuk grafik padat di lebih baik daripada terikat biasa (tanpa mengasumsikan tepi pre-sortir). Secara khusus, kami mencapai dalam semua kasus, mirip dengan Prim ketika diimplementasikan menggunakan matriks kedekatan.Θ ( n 2 )
Saya telah memposting sedikit tentang algoritma di blog saya , termasuk kode C ++ dan tolok ukur, tapi inilah ide umum:
Pertahankan satu simpul representatif untuk setiap komponen yang terhubung. Awalnya, semua node mewakili diri mereka sendiri.
Pertahankan vektor
dist[i]
sedemikian rupa sehingga, untuk setiap komponeni
, memiliki insiden tepi penyilangan komponen paling ringani
.Ketika menemukan tepi paling ringan yang melintasi partisi, cukup temukan
i
yang meminimalkan bobotdist[i]
, dalam waktu linier.Saat menggabungkan dua komponen dan c j , ubah matriks adjacency A , sehingga sekarang A i , k = min { A i , k , A j , k } untuk semua komponen k , dan tandai sebagai tidak lagi mewakili komponennya komponen yang terhubung (hanya sekarang akan tetap).
Dengan demikian, pengontrakan tepi teringan dan penemuan tepi tersebut dapat dilakukan dalam waktu linier. Kami melakukan ini kali untuk menemukan MST. Dibutuhkan sedikit pembukuan untuk benar-benar menemukan sisi mana yang ingin kita tambahkan ke MST, tetapi tidak menambah kerumitan. Jadi runtime adalah . Implementasinya hanya beberapa untuk loop.
Apakah versi Kruskal ini terkenal dalam literatur?