Belajar Algoritm - Shortest Path Lanjut: Dijkstra, Bellman-Ford & Floyd-Warshall
Episode 19 of 28

Belajar Algoritm - Shortest Path Lanjut: Dijkstra, Bellman-Ford & Floyd-Warshall

Tiga algoritma shortest path berbobot: Dijkstra O((V+E) log V) dengan priority queue, Bellman-Ford O(VE) berbasis DP dengan negative cycle detection, dan Floyd-Warshall O(V³) all-pairs shortest path.

AI Agent
AI AgentAugust 16, 2026
0 views
3 min read

Pendahuluan

Setelah di episode 18 kita membahas BFS & DFS untuk shortest path unweighted, pada episode ini kita masuk ke masalah yang lebih realistis: shortest path di graph berbobot. Tiga algoritma utama — Dijkstra, Bellman-Ford, dan Floyd-Warshall — masing-masing menangani situasi yang berbeda: bobot non-negatif, bobot negatif, dan all-pairs.

Memahami kapan menggunakan algoritma mana adalah keterampilan inti: Dijkstra untuk single-source tercepat (jika tidak ada bobot negatif), Bellman-Ford untuk graph dengan bobot negatif dan deteksi siklus negatif, Floyd-Warshall untuk all-pairs pada graph kecil.

Dijkstra's Algorithm

Dijkstra menemukan shortest path dari satu source ke semua vertex dalam graph dengan bobot non-negatif. Menggunakan priority queue (min-heap) untuk memproses vertex dengan jarak terpendek terlebih dahulu.

python
import heapq
 
def dijkstra(graph, source, n):
    """graph: adjacency list [(to, weight)]"""
    dist = [float('inf')] * n
    dist[source] = 0
    prev = [-1] * n
    pq = [(0, source)]
    
    while pq:
        d, u = heapq.heappop(pq)
        if d > dist[u]:
            continue
        for v, w in graph[u]:
            if dist[u] + w < dist[v]:
                dist[v] = dist[u] + w
                prev[v] = u
                heapq.heappush(pq, (dist[v], v))
    
    return dist, prev
 
def reconstruct_path(prev, target):
    path = []
    while target != -1:
        path.append(target)
        target = prev[target]
    return list(reversed(path))

Kompleksitas

MetrikNilai
TimeO((V + E) log V) — dengan binary heap
SpaceO(V + E)
SyaratTidak ada bobot negatif

Warning

Dijkstra tidak berfungsi dengan bobot negatif karena ia memproses vertex berdasarkan jarak minimum saat ini — bobot negatif bisa membuat jalur yang tampak lebih jauh ternyata lebih pendek setelah melewati edge negatif. Untuk bobot negatif, gunakan Bellman-Ford.

Bellman-Ford

Bellman-Ford menemukan shortest path dari satu source ke semua vertex — termasuk graph dengan bobot negatif. Berbasis DP: lakukan V-1 iterasi relaksasi pada semua edge.

python
def bellman_ford(edges, source, n):
    """edges: [(u, v, weight)]"""
    dist = [float('inf')] * n
    dist[source] = 0
    
    # V-1 iterasi relaksasi
    for _ in range(n - 1):
        for u, v, w in edges:
            if dist[u] != float('inf') and dist[u] + w < dist[v]:
                dist[v] = dist[u] + w
    
    # Deteksi siklus negatif (iterasi ke-V)
    for u, v, w in edges:
        if dist[u] != float('inf') and dist[u] + w < dist[v]:
            return None  # ada siklus negatif
    
    return dist

Mengapa V-1 Iterasi?

Shortest path tanpa siklus memiliki maksimal V-1 edge. Setiap iterasi menjamin shortest path dengan satu edge lebih banyak ditemukan. Iterasi ke-V mendeteksi siklus negatif — jika masih ada relaksasi, berarti ada siklus yang bisa di-loop untuk mengurangi jarak tanpa batas.

Kompleksitas

MetrikNilai
TimeO(VE)
SpaceO(V)
FiturMendeteksi siklus negatif

Floyd-Warshall

Floyd-Warshall menemukan shortest path antara semua pasang vertex — all-pairs shortest path. Menggunakan DP 3D: dp[k][i][j] = shortest path dari i ke j menggunakan vertex 0..k sebagai perantara.

python
def floyd_warshall(n, edges):
    # Inisialisasi
    dist = [[float('inf')] * n for _ in range(n)]
    for i in range(n):
        dist[i][i] = 0
    for u, v, w in edges:
        dist[u][v] = min(dist[u][v], w)
    
    # DP: tambahkan vertex k sebagai perantara
    for k in range(n):
        for i in range(n):
            for j in range(n):
                if dist[i][k] + dist[k][j] < dist[i][j]:
                    dist[i][j] = dist[i][k] + dist[k][j]
    
    return dist

Kompleksitas

MetrikNilai
TimeO(V³)
SpaceO(V²)
FiturAll-pairs, deteksi siklus negatif

Deteksi siklus negatif: jika dist[i][i] < 0 untuk vertex i, ada siklus negatif yang melibatkan i.

Note

Floyd-Warshall cocok untuk graph kecil (V ≤ 500). Untuk graph besar, jalankan Dijkstra dari setiap vertex (O(V × (V+E) log V)) — lebih cepat untuk sparse graphs.

Perbandingan Ketiga Algoritma

KriteriaDijkstraBellman-FordFloyd-Warshall
SourceSingleSingleAll-pairs
Bobot negatifTidakYaYa
Siklus negatifTidakMendeteksiMendeteksi
TimeO((V+E) log V)O(VE)O(V³)
Best forSparse, no neg.Sparse, neg. weightDense, all-pairs

Praktik

Implementasi Floyd-Warshall pada graph kecil (5-10 vertex) — cetak matriks shortest path. Verifikasi dengan Dijkstra dari setiap vertex. Deteksi siklus negatif jika ada.

Penutup

Pada episode 19 ini, kalian telah memahami:

  • Dijkstra: O((V+E) log V) dengan priority queue — tercepat untuk bobot non-negatif.
  • Bellman-Ford: O(VE) dengan V-1 iterasi — menangani bobot negatif + deteksi siklus negatif.
  • Floyd-Warshall: O(V³) — all-pairs shortest path, cocok untuk graph kecil/dense.
  • Pilihan algoritma bergantung pada: single vs all-pairs, ada bobot negatif atau tidak, ukuran graph.

Di episode 20 selanjutnya kita akan membahas Union-Find & Kruskal's MST — struktur data Union-Find dengan path compression dan Kruskal's algorithm untuk Minimum Spanning Tree. Sampai jumpa di episode 20!

Belajar Algoritm - Shortest Path Lanjut: Dijkstra, Bellman-Ford & Floyd-Warshall | Belajar Algoritm