Menu
CoddyTech

Algoritma Bellman-Ford

Terakhir diperbarui

Bellman-Ford adalah algoritma untuk mencari jalur terpendek dari satu node sumber ke setiap node lainnya, dan tidak seperti Dijkstra, algoritma ini tetap bekerja meskipun ada bobot edge yang negatif. Caranya adalah relaksasi brute force: algoritma ini berulang kali memindai setiap edge, dan jika melewati edge itu menghasilkan jarak yang lebih pendek, jarak node tujuannya diperbarui. Tekan Putar di atas untuk melihat jarak sementara turun dari putaran ke putaran.

Setelah V - 1 putaran atas semua edge, setiap jalur terpendek (yang paling banyak memiliki V - 1 edge) sudah ditemukan. Karena itu kompleksitasnya O(V · E), lebih lambat daripada Dijkstra, tetapi algoritma ini menangani bobot negatif dan bisa mendeteksi siklus berbobot negatif (jika putaran ke-V masih merelaksasi sebuah edge, jalur terpendek tidak ada).

Kompleksitas waktu dan ruang

UkuranKompleksitasCatatan
WaktuO(V · E)V − 1 putaran atas semua E edge
RuangO(V)Satu jarak per node
Bobot negatifDidukungKeunggulan utamanya dibanding Dijkstra
Siklus negatifBisa dideteksiPutaran ke-V yang masih merelaksasi menandakan adanya siklus negatif

Langkah demi langkah

LangkahApa yang terjadi
1Atur jarak sumber ke 0 dan semua jarak lainnya ke tak hingga.
2Ulangi langkah berikutnya sebanyak V − 1 kali.
3Untuk setiap edge (u → v, w), periksa apakah dist[u] + w < dist[v].
4Jika ya, relaksasi edge itu: atur dist[v] = dist[u] + w.
5Berhenti lebih awal jika satu putaran penuh tidak mengubah apa pun.

Contoh penerapan

Sumber S pada 4 node S, A, B, C dengan edge S→A (4), S→B (5), A→C (3), B→A (-3), direlaksasi dalam urutan itu. Jarak dimulai dari S=0 dan sisanya ∞:

PutaranJarak [S, A, B, C]Aksi
Awal[0, ∞, ∞, ∞]Jarak sumber 0, semua lainnya tak hingga.
1[0, 2, 5, 7]Relaksasi S→A menjadi 4, S→B menjadi 5, A→C menjadi 7, lalu B→A menurunkan A menjadi 5 + (-3) = 2.
2[0, 2, 5, 5]A→C sekarang memperbaiki C menjadi 2 + 3 = 5; tidak ada edge lain yang direlaksasi.
3[0, 2, 5, 5]Tidak ada edge yang direlaksasi, jadi jarak sudah final: A berbiaya 2 lewat S→B→A.

Kapan memakai Bellman-Ford

Pakai saatHindari saat
Bobot edge bisa negatif.Semua bobot tidak negatif (Dijkstra lebih cepat).
Kamu harus mendeteksi siklus berbobot negatif.Grafnya sangat besar dan padat: O(V · E) terlalu lambat.
Grafnya kecil atau renggang.Kamu hanya butuh satu query dari sumber ke tujuan pada graf yang besar.
Kamu butuh pembanding yang sederhana dan mudah diimplementasikan.Bobotnya tidak negatif dan latensi penting.

Kode Bellman-Ford Algorithm

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

Kode Bellman-Ford Algorithm dalam Python

Python
1def bellman_ford(vertices, edges, start):2    dist = {v: float("inf") for v in vertices}3    dist[start] = 04    # Relax every edge V-1 times5    for _ in range(len(vertices) - 1):6        for u, v, w in edges:7            if dist[u] + w < dist[v]:8                dist[v] = dist[u] + w9    # One more pass: any improvement means a negative cycle10    for u, v, w in edges:11        if dist[u] + w < dist[v]:12            raise ValueError("Graph contains a negative-weight cycle")13    return dist14
15
16vertices = ["A", "B", "C", "D", "E"]17edges = [18    ("A", "B", 6), ("A", "C", 7), ("B", "D", 5), ("B", "E", -4),19    ("C", "D", -3), ("D", "B", -2), ("E", "D", 7),20]21
22for node, d in bellman_ford(vertices, edges, "A").items():23    print(f"A -> {node}: {d}")
Jalankan kode ini di Playground Python

FAQ Bellman-Ford

Berapa kompleksitas waktu Bellman-Ford?
Bellman-Ford berjalan dalam waktu O(V · E): algoritma ini melakukan V - 1 putaran, dan setiap putaran merelaksasi semua E edge. Itu lebih lambat daripada O((V + E) log V) milik Dijkstra, dan itulah harga dari dukungan untuk bobot edge negatif.
Kapan sebaiknya memakai Bellman-Ford, bukan Dijkstra?

Pakai Bellman-Ford saat graf bisa memiliki bobot edge negatif, atau saat kamu perlu mendeteksi siklus berbobot negatif. Dijkstra lebih cepat, tetapi hanya benar untuk bobot yang tidak negatif. Contoh penggunaan nyata yang umum adalah mendeteksi peluang arbitrase penukaran mata uang, di mana siklus negatif berperan penting.

Bagaimana Bellman-Ford mendeteksi siklus negatif?
Setelah V - 1 putaran relaksasi, semua jalur terpendek sudah final jika tidak ada siklus negatif. Jika satu putaran tambahan masih bisa merelaksasi sebuah edge, berarti ada siklus berbobot negatif yang bisa dicapai, dan jalur terpendek tidak terdefinisi (kamu bisa terus berputar untuk menurunkan biayanya).
Apa perbedaan Bellman-Ford dan Floyd-Warshall?
Bellman-Ford menghitung jalur terpendek dari satu sumber dalam O(V · E), sedangkan Floyd-Warshall menghitung jalur terpendek untuk semua pasangan dalam O(V³). Pada graf yang padat, menjalankan Bellman-Ford dari setiap sumber berbiaya O(V² · E), jadi Floyd-Warshall biasanya pilihan yang lebih baik saat kamu butuh setiap pasangan. Keduanya menangani edge negatif dan bisa menandai siklus negatif.
Mengapa Bellman-Ford butuh tepat V - 1 putaran?
Setiap jalur terpendek pada graf tanpa siklus negatif memakai paling banyak V - 1 edge, karena jalur yang mengunjungi lebih dari V node pasti mengulang salah satunya. Setiap putaran menjamin minimal satu edge tambahan dari setiap jalur terpendek direlaksasi dengan benar, jadi V - 1 putaran sudah cukup untuk menuntaskan semuanya. Salah kaprah yang umum adalah anggapan bahwa putaran tambahan memperbaiki jawabannya. Itu tidak pernah terjadi, kecuali ada siklus negatif.
Bisakah Bellman-Ford berhenti lebih awal?
Bisa. Jika satu putaran penuh atas semua edge tidak merelaksasi apa pun, setiap jarak sudah optimal dan kamu bisa berhenti sebelum mencapai V - 1 putaran. Optimasi keluar lebih awal ini sering membuatnya jauh lebih cepat pada graf yang cepat mengerucut, meskipun batas kasus terburuknya tetap O(V · E).
Ilustrasi bahasa pemrograman di Coddy

Kuasai algoritma bersama Coddy

Mulai