My first Magazine pemrograman-kompetitif-dasar | Page 137
11.1 Shortest Path
5:
6:
7:
8:
9:
10:
11:
12:
13:
for i ← 1, V − 1 do
for hu, vi ∈ edgeList do
if dist[v] > dist[u] + w[u][v] then
dist[v] = dist[u] + w[u][v]
end if
end for
end for
return dist
end function
Algoritma 66 Pendeteksian negative cycle dengan memanfaatkan hasil pencarian shortest path
menggunakan Bellman—Ford.
function HAS N EGATIVE C YCLE (s)
2:
dist ← B ELLMAN -F ORD (s)
1:
3:
4:
5:
6:
7:
8:
9:
for hu, vi ∈ edgeList do
if dist[v] > dist[u] + w[u][v] then
return true
end if
end for
return f alse
end function
Terdapat V − 1 tahapan relaksasi edge , yang mana setiap relaksasi bekerja dalam O(E).
Secara jelas, kita dapat memperhatikan bahwa kompleksitas algoritma Bellman—Ford adalah
O(V E). Meskipun lebih lambat daripada Dijkstra, algoritma ini bersifat lebih umum.
11.1.3
Floyd—Warshall
Konsep
Kadang-kadang, kita membutuhkan informasi shortest path dari setiap node ke setiap node
lainnya pada suatu graf. Selain dengan menjalankan Dijkstra atau Bellman—Ford satu per satu
untuk setiap node , kita juga dapat menggunakan algoritma Floyd—Warshall.
Konsep dari algoritma ini adalah dynamic programming . Definisikan sebuah fungsi f (i, j, k)
yang menyatakan jarak terpendek untuk berpindah dari node i ke node j, dengan hanya menggu-
nakan node -node perantara {1, 2, 3, ..., k}. Nilai dari f (i, j, k) merupakan salah satu yang terkecil
dari:
• Jarak terpendek dari i ke j, apabila tidak menggunakan k sebagai perantaranya. Nilai ini
sama dengan f (i, j, k − 1).
• Jarak terpendek dari i ke j, apabila k digunakan sebagai perantaranya. Jaraknya adalah jarak
i ke k, ditambah k ke j, dengan masing-masing hanya boleh menggunakan {1, 2, 3, ..., k − 1}
sebagai perantaranya. Nilai ini sama dengan f (i, k, k − 1) + f (k, j, k − 1).
Kasus ketika perpindahan i ke j tidak boleh menggunakan perantara menjadi base case .
Kasus ini terjadi ketika k = 0, yang artinya node perantara yang boleh digunakan berupa himpunan
kosong. Pada kasus ini, f (i, j, 0) = w[i][ j].
127