Menu
CoddyTech

Algoritma Kruskal

Terakhir diperbarui

Algoritma Kruskal adalah algoritma untuk membangun minimum spanning tree (MST), yaitu himpunan edge termurah yang menghubungkan setiap node tanpa siklus. Algoritma ini mengurutkan semua edge berdasarkan bobotnya, lalu secara greedy menambahkan edge termurah berikutnya selama edge itu menghubungkan dua node yang belum terhubung. Tekan Putar di atas untuk melihat pohon tumbuh, satu edge aman termurah demi satu edge.

Pengecekan "sudah terhubung?" dilakukan dengan struktur data union-find (disjoint set): sebuah edge dilewati jika kedua ujungnya sudah berada di komponen yang sama, karena menambahkannya akan membentuk siklus. Pengurutan mendominasi biayanya, sehingga totalnya O(E log E). Kruskal unggul pada graf yang renggang.

Kompleksitas waktu dan ruang

UkuranKompleksitasCatatan
WaktuO(E log E)Didominasi oleh pengurutan edge
Operasi union-find≈ O(E α(V))Hampir konstan per pengecekan dengan path compression
RuangO(V + E)Daftar edge + struktur disjoint set
Paling cocok untukGraf renggangBekerja dari daftar edge global

Langkah demi langkah

LangkahApa yang terjadi
1Urutkan setiap edge berdasarkan bobot, dari kecil ke besar.
2Masukkan setiap node ke komponennya sendiri (union-find).
3Ambil edge termurah berikutnya.
4Jika kedua ujungnya ada di komponen yang berbeda, tambahkan edge itu ke pohon dan gabungkan (union) komponennya.
5Jika tidak, lewati (edge itu akan membentuk siklus).
6Berhenti begitu pohon punya V − 1 edge.

Contoh penerapan

Graf dengan node A, B, C, D dan edge A-B(1), B-C(2), A-C(3), C-D(4), B-D(5). Edge yang sudah diurutkan: A-B(1), B-C(2), A-C(3), C-D(4), B-D(5):

Edge (bobot)Komponen sebelumnyaAksi
A-B(1){A} {B} {C} {D}Komponen berbeda: tambahkan ke MST, gabungkan menjadi {A,B}.
B-C(2){A,B} {C} {D}Komponen berbeda: tambahkan ke MST, gabungkan menjadi {A,B,C}.
A-C(3){A,B,C} {D}A dan C sudah bersama: lewati (akan membentuk siklus).
C-D(4){A,B,C} {D}Komponen berbeda: tambahkan ke MST, gabungkan menjadi {A,B,C,D}.
Berhenti{A,B,C,D}Pohon punya V - 1 = 3 edge. MST = A-B, B-C, C-D, total bobot 7.

Kapan memakai algoritma Kruskal

Pakai saatHindari saat
Grafnya renggang (sedikit edge dibandingkan jumlah node).Grafnya padat: algoritma Prim dengan heap biasanya lebih cepat.
Edge sudah tersedia sebagai daftar global yang bisa kamu urutkan.Edge hanya tersedia lewat adjacency list yang harus kamu pindai per node.
Kamu ingin implementasi sederhana yang didukung union-find.Kamu butuh pohon yang tumbuh dari satu node awal tertentu.
Kamu ingin membangun spanning forest dari graf yang tidak terhubung.Kamu harus menangani edge yang datang terus-menerus tanpa pengurutan penuh.

Kode Kruskal's Algorithm

Implementasi Kruskal's Algorithm yang rapi dan siap dijalankan dalam Python, JavaScript, Java, C++, C. Pilih bahasa, salin kodenya, atau buka langsung di Coddy Playground.

Kode Kruskal's Algorithm dalam Python

Python
1def find(parent, x):2    while parent[x] != x:3        parent[x] = parent[parent[x]]  # path compression4        x = parent[x]5    return x6
7
8def kruskal(vertices, edges):9    # Take the cheapest edge that does not close a cycle10    parent = {v: v for v in vertices}11    mst, total = [], 012    for w, u, v in sorted(edges):13        root_u, root_v = find(parent, u), find(parent, v)14        if root_u != root_v:15            parent[root_u] = root_v16            mst.append((u, v, w))17            total += w18    return mst, total19
20
21vertices = ["A", "B", "C", "D", "E"]22edges = [23    (4, "A", "B"), (1, "A", "C"), (3, "B", "C"), (2, "B", "D"),24    (5, "C", "D"), (6, "C", "E"), (7, "D", "E"),25]26
27mst, total = kruskal(vertices, edges)28for u, v, w in mst:29    print(f"{u} - {v} (weight {w})")30print("Total MST weight:", total)
Jalankan kode ini di Playground Python

FAQ Algoritma Kruskal

Apa itu minimum spanning tree?
Minimum spanning tree (MST) dari graf berbobot yang terhubung adalah himpunan bagian edge yang menghubungkan semua node tanpa siklus dengan total bobot sekecil mungkin. MST punya tepat V - 1 edge untuk V node.
Apa perbedaan algoritma Kruskal dan algoritma Prim?

Keduanya membangun minimum spanning tree secara greedy. Kruskal mengurutkan semua edge secara global dan menambahkan edge termurah yang tidak membentuk siklus, dengan bantuan union-find. Prim menumbuhkan satu pohon ke luar dari sebuah node awal, selalu menambahkan edge termurah yang keluar dari pohon. Kruskal cocok untuk graf renggang; Prim (dengan heap) cocok untuk graf padat.

Mengapa algoritma Kruskal memakai union-find?

Sebelum menambahkan sebuah edge, Kruskal harus memeriksa apakah kedua ujungnya sudah terhubung, karena menambahkan edge seperti itu akan membentuk siklus. Union-find (disjoint set) menjawab "apakah keduanya ada di komponen yang sama?" dan menggabungkan komponen dalam waktu amortisasi yang hampir konstan, sehingga algoritmanya tetap efisien.

Kapan sebaiknya memakai algoritma Kruskal, bukan Prim?
Pilih Kruskal saat grafnya renggang dan kamu sudah punya semua edge dalam daftar yang bisa diurutkan: pengurutan O(E log E) murah saat E kecil. Algoritma Prim dengan binary heap atau Fibonacci heap cenderung menang pada graf padat dengan E mendekati V², karena tidak perlu mengurutkan setiap edge di awal.
Apakah algoritma Kruskal bekerja pada graf yang tidak terhubung?
Ya. Jika grafnya tidak terhubung, Kruskal tidak akan mencapai V - 1 edge dan justru menghasilkan minimum spanning forest, yaitu satu MST untuk setiap komponen terhubung. Hal ini terjadi secara alami karena union-find tidak pernah menggabungkan node yang tidak punya jalur di antaranya.
Apa kesalahan paling umum saat mengimplementasikan algoritma Kruskal?

Tidak memakai path compression dan union by rank pada union-find, sehingga setiap pengecekan keterhubungan berubah dari hampir konstan menjadi hampir linear dan bisa mendominasi waktu berjalannya. Bug lain yang sering terjadi adalah lupa benar-benar menggabungkan dua komponen setelah menambahkan sebuah edge, sehingga edge berikutnya bisa membentuk siklus.

Ilustrasi bahasa pemrograman di Coddy

Kuasai algoritma bersama Coddy

Mulai