Jika bobot tepi bilangan bulat dalam , Anda dapat mengimplementasikan Dijkstra untuk dijalankan dalam waktu O ( K | V | + | E | ) , mengikuti saran @rrenaud. Berikut ini penjelasan yang lebih eksplisit.{0,1,…,K}O(K|V|+|E|)
Kapan saja, kunci (hingga) dalam antrian prioritas berada dalam beberapa rentang , di mana D adalah nilai kunci terakhir yang dihapus dari antrian prioritas. (Setiap kunci setidaknya D , karena urutan kunci dihapus oleh algoritma Dijkstra adalah non-menurun, dan setiap kunci yang paling banyak D + K , karena setiap tombol memiliki nilai d [ u ] + w t ( u , w ) untuk beberapa tepi ( u ,{D,D+1,…,D+K}DDD+Kd[u]+wt(u,w) mana d [ u ] adalah jarak dari sumber ke beberapa simpul u yang telah dihapus, jadi d [ u ] ≤ D. )(u,w)d[u]ud[u]≤D
Karena itu, Anda dapat menerapkan antrian prioritas dengan array melingkar dengan ukuran K + 1 , dengan setiap sel berisi ember. Simpan setiap simpul dengan kunci k dalam ember di sel A [ h ( k ) ] di mana . Melacak . Lakukan operasi sebagai berikut:A[0..K]K+1kA[h(k)]h(k)=kmod(K+1)D
menghapus-min : Sementara kosong, kenaikan . Kemudian hapus dan kembalikan simpul dari .A[h(D)]DA[h(D)]
masukkan dengan kunci : Tambahkan simpul ke ember .kA[h(k)]
tombol-turun ke : Memindahkan titik dari ke .kk′A[h(k)]A[h(k′)]
Memasukkan dan mengurangi kunci adalah operasi waktu konstan, sehingga total waktu yang dihabiskan dalam operasi tersebut adalah . Total waktu yang dihabiskan di delete-min akan ditambah nilai akhir dari . Nilai akhir dari adalah maksimum (terbatas) jarak dari sumber ke setiap simpul (karena menghapus-min yang mengambil iterasi meningkat oleh ). Jarak maksimum paling banyak karena setiap jalur memiliki paling banyak tepi. Dengan demikian, total waktu yang dihabiskan oleh algoritma adalah .O(|V|+|E|)O(|V|)DDiDiK(|V|−1)|V|−1O(K|V|+|E|)