Minimum Spanning Tree (Kruskal & Prim) — Algoritma

Minimum Spanning Tree (MST) adalah sub-graph tree (tanpa siklus, terhubung) yang mencakup semua node dengan total bobot edge minimum. Analogi: Kamu mau…

Minimum Spanning Tree (MST) adalah sub-graph tree (tanpa siklus, terhubung) yang mencakup semua node dengan total bobot edge minimum.

Analogi: Kamu mau membangun jaringan listrik yang menghubungkan semua kota, dengan total panjang kabel paling pendek. Solusinya adalah MST.

Ciri MST

Untuk graph dengan V node, MST punya:

Ada dua algoritma klasik: Kruskal dan Prim. Keduanya greedy, hasilnya sama (MST valid), tapi pendekatannya berbeda.

Kruskal — Sort Edges + Union-Find

Ide: Urutkan semua edge dari bobot terkecil. Tambahkan satu per satu, skip edge yang akan membuat siklus.

Struktur kunci: Union-Find (Disjoint Set Union) untuk cek siklus dengan cepat.

class UnionFind {
  constructor(n) {
    this.parent = Array.from({ length: n }, (_, i) => i);
    this.rank = new Array(n).fill(0);
  }
  find(x) {
    if (this.parent[x] !== x) {
      this.parent[x] = this.find(this.parent[x]); // path compression
    }
    return this.parent[x];
  }
  union(a, b) {
    const ra = this.find(a), rb = this.find(b);
    if (ra === rb) return false; // sudah satu komponen → siklus
    if (this.rank[ra] < this.rank[rb]) this.parent[ra] = rb;
    else if (this.rank[ra] > this.rank[rb]) this.parent[rb] = ra;
    else { this.parent[rb] = ra; this.rank[ra]++; }
    return true;
  }
}

function kruskal(n, edges) {
  // edges: [[u, v, w], ...]
  edges.sort((a, b) => a[2] - b[2]);

  const uf = new UnionFind(n);
  const mst = [];
  let totalWeight = 0;

  for (const [u, v, w] of edges) {
    if (uf.union(u, v)) {
      mst.push([u, v, w]);
      totalWeight += w;
      if (mst.length === n - 1) break; // MST lengkap
    }
  }
  return { mst, totalWeight };
}

// 4 node, edges: [u, v, weight]
const edges = [
  [0, 1, 10],
  [0, 2, 6],
  [0, 3, 5],
  [1, 3, 15],
  [2, 3, 4],
];
kruskal(4, edges);
// mst: [[2,3,4], [0,3,5], [0,1,10]], totalWeight: 19

Kompleksitas: O(E log E) untuk sort + O(E α(V)) untuk union-find ≈ O(E log E).

Prim — Grow from Vertex

Ide: Mulai dari satu node. Di setiap langkah, tambahkan edge dengan bobot terkecil yang menghubungkan node di dalam MST dengan node di luar MST.

Struktur kunci: Min-heap (priority queue).

function prim(adj, start = 0) {
  // adj[node] = [[neighbor, weight], ...]
  const inMST = new Set([start]);
  const edges = []; // min-heap: [weight, u, v]

  for (const [v, w] of adj[start]) edges.push([w, start, v]);

  const mst = [];
  let totalWeight = 0;

  while (edges.length > 0 && mst.length < Object.keys(adj).length - 1) {
    edges.sort((a, b) => a[0] - b[0]); // min-heap simulasi
    const [w, u, v] = edges.shift();

    if (inMST.has(v)) continue; // sudah di MST, skip

    inMST.add(v);
    mst.push([u, v, w]);
    totalWeight += w;

    for (const [next, nw] of adj[v]) {
      if (!inMST.has(next)) edges.push([nw, v, next]);
    }
  }
  return { mst, totalWeight };
}

Kompleksitas: O(E log V) dengan min-heap.

Kruskal vs Prim

Fitur Kruskal Prim
Pendekatan Sort semua edge dulu Grow dari 1 node
Struktur data Union-Find Min-Heap
Cocok untuk Sparse graph (E kecil) Dense graph (E besar)
Graph disconnected? Handle natural — berhenti saat MST tidak mungkin Harus mulai ulang per komponen
Implementasi Lebih sederhana jika sudah ada UF Mirip Dijkstra

Kegunaan Nyata

Fun fact: Kruskal dipublikasikan tahun 1956 (oleh Joseph Kruskal), Prim tahun 1957 (oleh Robert Prim — tapi sebenarnya Vojtěch Jarník sudah menemukan tahun 1930!). Algoritma klasik ini masih dipakai di sistem modern setelah 70+ tahun.

🎭 Analogi sehari-hari: PT PLN mau pasang kabel listrik ke semua kampung. Tujuannya: semua kampung dapet listrik dengan kabel paling sedikit. Solusi = MST. Tidak ada kampung yang skip, tidak ada loop kabel berlebih. Ini contoh klasik MST di dunia nyata.

💡 Kruskal vs Prim mental model:

Hasil sama. Kruskal cocok untuk sparse, Prim untuk dense.

⚠️ Jebakan umum:

🎯 MST kapan?

🧪 Tebakan cepat: 6 kota, 9 edges. MST punya berapa edges? n-1 = 5. Selalu V-1 untuk MST.

TL;DR: MST = pohon yang sambung semua node dengan total weight minimum. Selalu V-1 edges. Kruskal (sort + UF, bagus sparse), Prim (grow + heap, bagus dense). Greedy works (greedy-choice property).

Yang akan kamu pelajari