My first Magazine pemrograman-kompetitif-dasar | Page 135
11.1 Shortest Path
Untuk kasus terburuk, seluruh node dapat dicapai dari s sehingga terdapat V iterasi. Pada
setiap iterasi, dilakukan pencarian node untuk di-relax dan proses relax . Algoritma 62 menun-
jukkan pencarian node untuk di-relax yang diimplementasikan dengan linear search , sehingga
kompleksitas sekali pencariannya adalah O(V ). Untuk proses relax sendiri, total kompleksitas-
nya ketika seluruh node di-relax adalah O(E). Kompleksitas total untuk implementasi ini adalah
O(V 2 + E). Kompleksitas ini juga dapat dituliskan sebagai O(V 2 ) saja, sebab banyaknya edge
dibatasi oleh V 2 .
Optimisasi dengan heap
Pencarian node untuk di-relax sebenarnya merupakan pencarian nilai terkecil dari suatu
kumpulan. Kita dapat menggunakan struktur data heap untuk membuat pencarian ini lebih efisien,
yaitu O(logV ) per pencarian.
Heap yang kita perlukan adalah min -heap , yang menyimpan daftar node yang terurut
berdasarkan jarak tempuh sejauh ini. Untuk mempermudah implementasi, kita dapat membuat
heap yang dapat menyimpan elemen berupa pasangan data h jarak, nodei. Setiap kali jarak
tempuh suatu node diperbaharui, masukkan datanya ke dalam heap . Hal ini memungkinkan heap
menyimpan beberapa node yang sama dengan jarak yang berbeda. Tidak menjadi masalah, sebab
ketika hasil pop heap adalah node yang sudah dikunjungi, kita cukup mengabaikannya. Algoritma
64 menunjukkan implementasi yang dioptimisasi dengan heap .
Algoritma 64 Implementasi algoritma Dijkstra dengan optimisasi heap .
1:
2:
3:
4:
5:
6:
7:
function D IJKSTRA (s)
dist ← new integer[V + 1]
visited ← new boolean[V + 1]
pred ← new integer[V + 1]
FILL A RRAY (dist, ∞)
FILL A RRAY (visited, f alse)
FILL A RRAY (pred, −1)
8: INITIALIZE H EAP ()
9: PUSH (h0, si)
10:
11:
12:
13:
14:
15:
16:
17:
18:
19:
20:
21:
22:
23:
24:
25:
. Buat sebuah min-heap
. Masukkan node s dengan jarak tempuh 0 ke dalam heap
dist[s] ← 0
while not IS E MPTY H EAP () do
hcurDist, ui ← POP ()
. Dapatkan node yang jarak tempuhnya terkecil
if not visited[u] then
. Hanya proses apabila u belum dikunjungi
visited[u] ← true
for v ∈ ad j(u) do
. Lakukan relax untuk semua tetangga u
if dist[v] > dist[u] + w[u][v] then
dist[v] = dist[u] + w[u][v]
pred[v] = u
PUSH (hdist[v], vi) . Masukkan jarak dan node yang diperbaharui ke heap
end if
end for
end if
end while
return dist
end function
125