Algoritma-algoritma Shortest
Path Lain
Algoritma Bellman-Ford
• Memecahkan masalah Single Source SP untuk kasus bobot negatif
• Ide:
– Inisialisasi tabel shortest path dari source ke semua verteks lain ∞kecuali dari source ke source 0.
– relaksasi tabel shortest path dalam n-1 iterasi setiap pasangan verteks u dan v jika sisi (u,v) ada
• Syarat: tidak ada siklus negatif krn tidak ada solusi
• Kompleksitas O(NM) untuk N jumlah verteks dan M jumlah sisi
Relaksasi
• Update tabel jarak minimum ke verteks u (yaitu d[v]) yang diketahui hingga saat itu atas dasar informasi jarak minimum ke
verteks v (yaitu d[u]) dan bobot sisi antar u dan v (yaitu w[u][v])
relax(u,v,w) {
if (d[v] > d[u] + w[u][v])
d[v] = d[u] + w[u][v]
}
Algoritma
Inisialisasi tabel jarak d[ ] Iterate in n-1 times:
For each vertex pair of u & v where edge is (u,v) in in E[G]
do relax(u,v,weight)
// periksa jika terdapat siklus negatif
For each vertex pair of u & v where edge (u,v) is in in E[G]
do
If (d[v] > d[u] + weight[u][v]) then return false return true // tidak terdapat siklus negatif
u
x y
v
z
6
7
8
5 -2
2 9
7 -3
-4
∞ ∞
∞
∞ 0
Inisialisasi: hanya d[z] = 0, lainnya ∞
u
x y
v
z
6
7
8
5 -2
2 9
7 -3
-4
6 ∞
∞ 7
0
iterasi pertama: Dari semua pasangan hanya d[u] dan d[x] yang terupdate saat relaksasi
u
x y
v
z
6
7
8
5 -2
2 9
7 -3
-4
6 4
2 7
0
iterasi kedua: Dari semua pasangan hanya d[v] dan d[y] yang terupdate saat relaksasi
u
x y
v
z
6
7
8
5 -2
2 9
7 -3
-4
2 4
2 7
0
iterasi ketiga: Dari semua pasangan hanya d[u] yang terupdate saat relaksasi (d[u] terupdate yang kedua kalinya)
u
x y
v
z
6
7
8
6 -2
2 9
7 -3
-4
2 4
-2 7
0
iterasi keempat: Dari semua pasangan hanya d[y] yang terupdate saat relaksasi (d[y] terupdate yang kedua kalinya)
Konstruksi Path
• Untuk konstruksi path diperlukan array
predesesor yang mencatat melalui verteks v mana harga d[u] diperoleh saat
relaksasi.
– Dari verteks tujuan, mundur ke predesesor, kemudian mundur lagi, dst… hingga sampai di verteks source
Improvement Relaksasi dari Yen
• Sebelum pass pertama urutan linear v1,v2, …, vn
• Partisi E ke dalam Ef dan Eb:
– Ef: {(vi,vj) dl E: I < j}, definisikan Gf = (V, Ef) – Eb: {(vi,vj) dl E: I > j}, definisikan Gb = (V, Eb)
• Gf adalah graf assiklik dengan urutan topological
<v1,v2,…vn> dan Gb graf asiklik dengan urutan topological <vn, vn-1, …,v1>
• Modifikasi algoritma Bellman-Ford
– Visit setiap verteks dg urutan <v1,v2,…vn>, relakasi sisi-sisi dl Ef
– Visit setiap verteks dg urutan <vn,vn-1,…v1>, relakasi sisi-sisi dl Eb
Algoritma Floyd-Warshall
• All-pair Shortest path problem
– Menemukan shortest path dari setiap pasangan verteks dalam graf
• Berdasarkan formulasi rekursif Dynamic Programming
– Periksa path antara vi-vj apakah bisa lebih pendek melalui path vi-vk dan vk-vj ?
• Kompleksitas O(N
3)
Ide Forumulasi Rekursif (DP)
• Verteks-verteks antara dalam shortest path
• jika V = {1,2,3,…,N}
• Untuk k=0,…, n, maka d
ij(k) =• wij, untuk k=0
• Min(dij(k-1), dik(k-1)+dkj(k-1)), untuk k > 0
• Solusi adalah d
ij(n)merupakan matriks
shortest path dari verteks i ke verteks j.
• Formulasi tsb dpt di visualisasi dengan mudah sbb
• Pada iterasi ke k, elemen d(i,j)
dibandingkan
dengan d(i,k)+d(k,j)
d(k, j)
1
5 4
2
-4 3
-5
6 2
4
1
3 7
0 6
∞
∞
∞
∞ 0
-5
∞ 2
∞
∞ 0
4
∞
7 1
∞ 0
∞
-4
∞ 8
3 0
8
0 6
∞
∞
∞
-2 0
-5 5
2
∞
∞ 0
4
∞
7 1
∞ 0
∞
-4
∞ 8
3 0
0 6
∞
∞
∞
-2 0
-5 5
2
11 5
0 4
∞
7 1
∞ 0
∞
-4 4
8 3
0
-2 0
-5 -1
2
11 5
0 4
∞
7 1
∞ 0
∞
-4 4
8 3
0
-2 0
-5 -1
2
3 5
0 4
7
-1 1
-4 0
3
-4 4
-1 3
0
0 6
1 5
8
-2 0
-5 -1
2
3 5
0 4
7
-1 1
-4 0
3
-4 2
-3 1
0
Konstruksi Path
• Gunakan matriks predesesor
• Saat inisialisasi diisi dengan i jika sisi (i, j) ada dalam E
• Saat iterasi, jika elemen jarak(i, j) terupdate
pada iterasi ke k, maka elemen predesesor (i, j) diupdate dengan harga k
• Setelah semua iterasi maka elemen predesesor menunjukan verteks k antara yang dilalui path dari i ke j dan diperiksa lagi secara rekursif
untuk mendapatkan verteks antara dari i ke k dan dari k ke j.
- 5
4 3
4
1 -
4 3
4
1 2
- 3
4
1 2
4 0
4
1 5
4 3
-
Contoh
• eg yang diperoleh dari contoh sebelumnya:
• Dari 3 ke 5, melalui 1
• Dari 3 ke 1, melalui 4
• Dari 3 ke 4, melalui 2
• Dari 3 ke 2, langsung
• Dari 2 ke 4, langsung
• Dari 4 ke 1, langsung
• Dari 1 ke 5, langsung