Menurut halaman ini , algoritma Dijkstra hanyalah BFS dengan antrian prioritas. Apakah sesederhana itu? Saya pikir tidak.
algorithms
graphs
shortest-path
Barry Fruitman
sumber
sumber
Jawaban:
Anda dapat mengimplementasikan algoritma Dijkstra sebagai BFS dengan antrian prioritas (meskipun itu bukan satu-satunya implementasi).
Algoritma Dijkstra bergantung pada properti bahwa jalur terpendek dari ke juga jalur terpendek ke salah satu simpul di sepanjang jalur. Inilah yang dilakukan BFS.ts t
Atau dalam perspektif lain: bagaimana algoritma Dijkstra akan berperilaku jika semua bobotnya 1? Persis seperti BFS.
sumber
Berikut adalah ide dari buku "Algoritma (Bagian 4.4)" oleh Dasgupta et al:
Untuk setiap tepi dari (dengan bobot ), ganti dengan tepi dengan panjang , dengan menambahkan dummy node antara u dan v .E l e l e 1 l e - 1e = ( u , v ) E le le 1 le−1 u v
Akibatnya, tepi grafik hasil semuanya memiliki panjang satuan. Oleh karena itu, kita dapat menghitung jarak dalam G dengan menjalankan BFS pada G ′ .G′ G G′
BFS pada dapat benar-benar lambat jika beberapa l e besar karena limbah terlalu banyak waktu di jarak ke simpul boneka komputasi yang kita tidak peduli tentang sama sekali. Algoritma Dijkstra menghindari hal ini dengan menetapkan jarak perkiraan untuk node dan membuat mereka rileks jika memungkinkan.G′ le
Berperilaku persis sama dengan BFS. Kami menguraikan ini dari dua poin utama.
Pada "relaksasi".
Untuk algoritma Dijkstra pada grafik umum, tertimbang, relaksasi adalah
Pada "antrian prioritas".
Ketika algoritma Dijkstra dijalankan pada grafik tidak berbobot, setiap saat, antrian prioritas berisi paling banyak dua nilai (jarak) yang berbeda. Oleh karena itu, antrian FIFO BFS sudah mencukupi.
sumber