Algoritmalar

Bellman-Ford

Graflar O(V · E) O(V)

Her kenarı V−1 kez gevşeterek negatif kenar ağırlıklarında da çalışan, kaynaktan en kısa yollar.

675-4-3923012345
Kaynak
1/28

Tüm mesafeler ∞ olarak başlatılıyor.

Değişmezk tur sonra, en fazla k kenar kullanan tüm en kısa yollar bulunmuştur. V−1 tur her basit yolu kapsar.

bellman-ford.c
#define V 6
#define INF 1000000
int bellmanFord(int graph[V][V], int src, int dist[V]) {
for (int i = 0; i < V; i++) dist[i] = INF;
dist[src] = 0;
for (int pass = 1; pass < V; pass++) {
for (int u = 0; u < V; u++) {
if (dist[u] == INF) continue;
for (int v = 0; v < V; v++) {
if (graph[u][v] &&
dist[u] + graph[u][v] < dist[v])
dist[v] = dist[u] + graph[u][v];
}
}
}
/* One extra sweep: an edge that still relaxes after V-1
passes proves a negative cycle is reachable. */
for (int u = 0; u < V; u++)
for (int v = 0; v < V; v++)
if (graph[u][v] && dist[u] != INF &&
dist[u] + graph[u][v] < dist[v])
return 0;
return 1;
}

Bellman-Ford nasıl çalışır?

Tüm kenarları V−1 kez gevşet. k. geçişten sonra ≤ k kenarlı tüm en kısa yollar doğrudur; V. geçişte hâlâ iyileşme olması negatif döngü kanıtıdır.

En iyi durum

Bir geçiş hiçbir şeyi değiştirmezse erken durur.

En kötü durum

O(V·E) — her geçiş her kenara dokunur.

Ne zaman kullanılır?

Negatif kenar ağırlıklı graflar veya negatif döngü tespiti gerektiğinde.