Menu
CoddyTech

Algoritma Dijkstra

Terakhir diperbarui

Algoritma Dijkstra adalah algoritma untuk mencari jalur terpendek dari sebuah node sumber ke setiap node lain pada graf dengan bobot edge yang tidak negatif. Algoritma ini menyimpan jarak sementara untuk setiap node, berulang kali menetapkan (settle) node belum tetap yang jarak sementaranya paling kecil, lalu merelaksasi edge-nya, yaitu memperbarui jarak sebuah tetangga setiap kali ditemukan rute yang lebih pendek lewat node saat ini. Tekan Putar di atas untuk melihat jarak turun saat setiap node ditetapkan.

Inti idenya bersifat greedy: begitu node belum tetap yang terdekat dipilih, jaraknya sudah final, karena semua rute lain menuju node itu harus melewati node yang sudah lebih jauh. Dengan priority queue berbasis binary heap, Dijkstra berjalan dalam waktu O((V + E) log V). Algoritma ini membutuhkan bobot yang tidak negatif; pakai Bellman-Ford jika edge bisa bernilai negatif.

Kompleksitas waktu dan ruang

ImplementasiKompleksitasCatatan
Binary heapO((V + E) log V)Pilihan umum yang praktis
Pemindaian arrayO(V²)Lebih sederhana; cocok untuk graf padat
RuangO(V)Jarak + priority queue
MembutuhkanBobot tidak negatifEdge negatif merusak pilihan greedy

Langkah demi langkah

LangkahApa yang terjadi
1Atur jarak sumber ke 0 dan semua jarak lainnya ke tak hingga.
2Pilih node belum tetap dengan jarak sementara paling kecil.
3Tandai sudah tetap: jarak terpendeknya kini final.
4Untuk setiap tetangga, hitung jarak lewat node saat ini + bobot edge.
5Jika hasilnya lebih kecil daripada jarak tetangga saat ini, relaksasi.
6Ulangi sampai semua node yang bisa dicapai sudah tetap.

Contoh penerapan

Jalur terpendek dari sumber A pada graf dengan edge A-B=4, A-C=1, C-B=2, C-D=5, B-D=1:

LangkahDitetapkanJarakAksi
0-A=0, B=∞, C=∞, D=∞Inisialisasi: sumber A=0, semua lainnya tak hingga.
1A (0)B=4, C=1, D=∞Relaksasi edge dari A: atur B=4, C=1.
2C (1)B=3, D=6Lewat C: B=1+2=3 mengalahkan 4; D=1+5=6.
3B (3)D=4Lewat B: D=3+1=4 mengalahkan 6.
4D (4)A=0, C=1, B=3, D=4Tetapkan D; tidak ada lagi yang perlu direlaksasi. Selesai.

Kapan memakai algoritma Dijkstra

Pakai saatHindari saat
Semua bobot edge tidak negatifAda edge yang bisa negatif: pakai Bellman-Ford
Kamu butuh jalur terpendek dari satu sumber ke semua nodeKamu butuh jalur terpendek untuk semua pasangan: Floyd-Warshall lebih sederhana
Grafnya berbobot dan kamu ingin jarak yang tepatGrafnya tak berbobot: BFS biasa lebih cepat dan lebih sederhana
Kamu punya heap/priority queue yang bagusKamu ingin mencapai satu target dengan cepat memakai heuristik: pakai A*

Kode Dijkstra's Algorithm

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

Kode Dijkstra's Algorithm dalam Python

Python
1import heapq2
3
4def dijkstra(graph, start):5    dist = {node: float("inf") for node in graph}6    dist[start] = 07    pq = [(0, start)]8    while pq:9        d, node = heapq.heappop(pq)10        if d > dist[node]:11            continue  # stale entry, a shorter path was already found12        for neighbor, weight in graph[node]:13            new_dist = d + weight14            if new_dist < dist[neighbor]:15                dist[neighbor] = new_dist16                heapq.heappush(pq, (new_dist, neighbor))17    return dist18
19
20graph = {21    "A": [("B", 4), ("C", 1)],22    "B": [("D", 1)],23    "C": [("B", 2), ("D", 5)],24    "D": [("E", 3)],25    "E": [],26}27
28for node, d in dijkstra(graph, "A").items():29    print(f"A -> {node}: {d}")
Jalankan kode ini di Playground Python

FAQ Algoritma Dijkstra

Berapa kompleksitas waktu algoritma Dijkstra?
Dengan priority queue berbasis binary heap, algoritma ini berjalan dalam O((V + E) log V). Versi sederhana yang memindai array untuk mencari nilai minimum di setiap langkah bernilai O(V²), dan versi ini justru bisa lebih cepat pada graf yang padat. Keduanya memakai ruang O(V).
Mengapa Dijkstra tidak bekerja dengan bobot edge negatif?

Dijkstra berasumsi bahwa begitu node belum tetap yang terdekat ditetapkan, jaraknya sudah final. Edge negatif bisa kemudian menciptakan jalur yang lebih pendek ke node yang sudah ditetapkan, sehingga asumsi itu runtuh. Untuk graf dengan bobot negatif, pakai algoritma Bellman-Ford.

Apa perbedaan Dijkstra dan BFS?

BFS mencari jalur terpendek dengan menghitung jumlah edge (setiap bobot edge pada dasarnya bernilai 1), memakai queue biasa. Dijkstra memperluas ide ini ke graf berbobot dengan selalu memperluas node yang total jaraknya paling kecil, memakai priority queue. Pada graf tak berbobot, keduanya menghasilkan jalur yang sama.

Apa perbedaan Dijkstra dan pencarian A*?

A* adalah Dijkstra ditambah heuristik yang memperkirakan sisa jarak ke target, sehingga pencarian diarahkan ke tujuan itu alih-alih meluas secara merata ke segala arah. Jika heuristiknya nol, A* menjadi persis sama dengan Dijkstra. Pakai A* saat kamu punya satu tujuan dan heuristik admissible yang bagus; pakai Dijkstra saat kamu butuh jarak ke setiap node.

Kapan sebaiknya memakai Dijkstra, bukan Bellman-Ford?
Pakai Dijkstra setiap kali semua bobot edge tidak negatif: algoritma ini lebih cepat dengan O((V + E) log V) dibandingkan O(V·E) milik Bellman-Ford. Pilih Bellman-Ford hanya saat edge bisa negatif atau kamu perlu mendeteksi siklus negatif. Pada graf dengan bobot tidak negatif, Dijkstra hampir selalu pilihan yang lebih baik.
Bisakah Dijkstra mengunjungi ulang node yang sudah ditetapkan?

Tidak. Begitu sebuah node ditetapkan, jaraknya sudah final dan tidak pernah direlaksasi lagi. Jebakan yang umum pada implementasi heap adalah membiarkan entri usang di priority queue setelah jarak sebuah node membaik; kamu harus melewati node hasil pop jika node itu sudah ditetapkan (jarak hasil pop-nya melebihi jarak yang tercatat). Lupa melakukan pengecekan ini tetap menghasilkan jawaban yang benar, tetapi membuang kerja.

Ilustrasi bahasa pemrograman di Coddy

Kuasai algoritma bersama Coddy

Mulai