Graph — Konsep — Struktur Data

Graph adalah kumpulan node (vertex) yang dihubungkan oleh edge (sisi). Tidak seperti tree, graph bisa punya cycle dan node bisa terhubung ke siapa saja. Jenis…

Graph adalah kumpulan titik yang disambung garis. Titiknya disebut node (atau vertex), garisnya disebut edge. Contoh paling gampang: peta, dengan kota sebagai node dan jalan antar kota sebagai edge. Media sosial juga graph: orang adalah node, pertemanan adalah edge.

🧪 Tebakan cepat: ada jalan antara Jakarta dan Bandung. Kalau kamu tanya Bandung "tetanggamu siapa saja?", apa Jakarta ikut disebut? Tebak dulu, jawabannya ada di bagian "Node, edge, dan tetangga".

Node, edge, dan tetangga

Jakarta ----- Surabaya
   |             |
Bandung ----- Yogya

Peta ini punya 4 node (kota) dan 4 edge (jalan). Di kode, graph biasanya disimpan sebagai adjacency list: tiap node punya array berisi tetangganya.

const graph = {
  Jakarta: ["Bandung", "Surabaya"],
  Bandung: ["Jakarta", "Yogya"],
  Yogya: ["Bandung", "Surabaya"],
  Surabaya: ["Yogya", "Jakarta"],
};

console.log(graph["Jakarta"]);        // ["Bandung", "Surabaya"]
console.log(graph["Jakarta"].length); // 2

Jalan dari Jakarta ke Bandung, Yogya, Surabaya, lalu balik ke Jakarta membentuk cycle: jalur yang kembali ke titik awalnya. Tree yang sudah kamu kenal sebenarnya graph yang semua node-nya tersambung dan gak punya cycle. Graph lebih bebas: boleh ada cycle, dan satu node boleh tersambung ke siapa saja.

Arah dan bobot

Membuatnya dengan class dan Map

class Graph {
  constructor() {
    this.adjacency = new Map(); // node → array tetangga
  }

  addVertex(v) {
    if (!this.adjacency.has(v)) this.adjacency.set(v, []);
  }

  addEdge(v1, v2) {
    this.addVertex(v1); // node yang belum ada ikut dibuat
    this.addVertex(v2);
    this.adjacency.get(v1).push(v2); // graph tanpa arah:
    this.adjacency.get(v2).push(v1); // catat di kedua ujung
  }
}

const g = new Graph();
g.addEdge("Jakarta", "Bandung");
g.addEdge("Jakarta", "Surabaya");
console.log(g.adjacency.get("Jakarta")); // ["Bandung", "Surabaya"]
console.log(g.adjacency.get("Bandung")); // ["Jakarta"]

Adjacency list atau adjacency matrix?

Cara lain menyimpan graph adalah adjacency matrix: tabel (array 2D) berukuran jumlah node kali jumlah node, berisi 1 kalau ada edge dan 0 kalau gak. Mengecek "ada edge antara A dan B?" langsung, O(1), tapi tabelnya selalu penuh, walaupun edge-nya sedikit: 1.000 node butuh 1.000.000 kotak. Adjacency list cuma menyimpan edge yang memang ada, jadi jauh lebih hemat untuk graph yang edge-nya sedikit (sparse). Pilih list, kecuali hampir semua node saling tersambung.

⚠️ Jebakan yang sering ketemu

TL;DR: Graph adalah node yang disambung edge. Tetangga sebuah node adalah node yang tersambung langsung, dan degree adalah jumlah tetangganya. Adjacency list menyimpan array tetangga untuk tiap node, misalnya di Map. Graph tanpa arah mencatat tiap edge di kedua ujungnya; graph berarah cuma di node asalnya. Adjacency list hemat untuk graph yang edge-nya sedikit, adjacency matrix selalu butuh node kali node kotak.

Yang akan kamu pelajari