Minimum Spanning Tree menemukan subset edge dengan total bobot minimum yang menghubungkan semua node. Di episode ini kalian memahami Kruskal dengan sort edges dan Union-Find, Prim dengan priority queue, serta mempraktikkan keduanya pada weighted undirected graph.

Setelah di episode 18 kita memahami shortest path — Dijkstra dan Bellman-Ford — pada episode ini kita mempelajari Minimum Spanning Tree (MST): subset edge dari connected weighted undirected graph yang menghubungkan semua node dengan total bobot minimum, tanpa cycle.
MST bukan hanya konsep teori — ia digunakan dalam desain jaringan (menyambung kota dengan kabel minimum), clustering, dan approximations untuk masalah NP-hard. Dua algoritma utama: Kruskal (edge-centric, greedy) dan Prim (vertex-centric, greedy).
MST dari graph G adalah subtree T yang:
Kruskal memilih edge dengan bobot terkecil terlebih dahulu, asalkan tidak membentuk cycle. Menggunakan Union-Find (Disjoint Set Union) untuk mendeteksi cycle secara efisien.
def kruskal(num_nodes, edges):
edges.sort(key=lambda x: x[2])
parent = list(range(num_nodes))
rank = [0] * num_nodes
def find(x):
if parent[x] != x:
parent[x] = find(parent[x])
return parent[x]
def union(x, y):
rx, ry = find(x), find(y)
if rx == ry:
return False
if rank[rx] < rank[ry]:
rx, ry = ry, rx
parent[ry] = rx
if rank[rx] == rank[ry]:
rank[rx] += 1
return True
mst = []
for u, v, weight in edges:
if union(u, v):
mst.append((u, v, weight))
return mstPrim memulai dari satu vertex, lalu terus menambahkan edge terpendek yang menghubungkan tree ke node di luar tree. Menggunakan priority queue.
import heapq
def prim(graph, start=0):
visited = set()
mst = []
pq = [(0, start, -1)]
while pq:
weight, node, prev = heapq.heappop(pq)
if node in visited:
continue
visited.add(node)
if prev != -1:
mst.append((prev, node, weight))
for neighbor, w in graph[node]:
if neighbor not in visited:
heapq.heappush(pq, (w, neighbor, node))
return mst| Aspek | Kruskal | Prim |
|---|---|---|
| Pendekatan | Edge-centric | Vertex-centric |
| Data structure | Union-Find | Priority queue |
| Dense graph | Kurang efisien | Lebih efisien |
| Sparse graph | Lebih efisien | Kurang efisien |
| Implementasi | Lebih sederhana | Lebih intuitif |
edges = [
(0, 1, 4), (0, 2, 2), (1, 2, 1),
(1, 3, 5), (2, 3, 8), (2, 4, 10),
(3, 4, 2)
]
mst_kruskal = kruskal(5, edges)
print("Kruskal MST:", mst_kruskal)
print("Total weight:", sum(w for _, _, w in mst_kruskal))
graph = {
0: [(1, 4), (2, 2)],
1: [(0, 4), (2, 1), (3, 5)],
2: [(0, 2), (1, 1), (3, 8), (4, 10)],
3: [(1, 5), (2, 8), (4, 2)],
4: [(2, 10), (3, 2)]
}
mst_prim = prim(graph, 0)
print("Prim MST:", mst_prim)
print("Total weight:", sum(w for _, _, w in mst_prim))Note
Kruskal menggunakan Union-Find (Disjoint Set Union) yang akan kita pelajari mendalam di episode 20. Jika kalian belum familiar dengan path compression dan union by rank, episode 20 akan menjelaskannya secara detail.
Inti yang harus dibawa pulang:
Ini adalah episode terakhir di Fase 4: Graphs. Di episode 20 selanjutnya kita memasuki Fase 5: Struktur Lanjutan & Khusus dengan membahas Union-Find (Disjoint Set Union) — struktur data yang memungkinkan merge dan query set secara hampir O(1). Union-Find adalah komponen kunci dari Kruskal's algorithm yang baru saja kita pelajari!