Penerapan Djikstra dalam pencarian jarak terdekat
Full Code :
1. Analisis Fungsi Satu per Satu
void printPath(int target, const vector<int>& parent)
Kegunaan: Fungsi ini bertanggung jawab untuk merekonstruksi dan mencetak jalur rute yang dilewati dari titik asal (source) hingga ke titik tujuan (target).
Cara Kerja: Algoritma Dijkstra mencatat rute secara terbalik (dari belakang ke depan) menggunakan vektor
parent. Fungsi ini melakukan perulangan mundur (curr = parent[curr]) mulai dari node tujuan hingga menemukan-1(tanda bahwa kita sudah sampai di node asal). Karena urutannya terbalik, fungsi menggunakanreverse()agar rute dicetak dengan benar (misal:1 -> 3 -> 2 -> 4).
void dijkstra(int source, int destination, int totalNodes, const vector<vector<Edge>>& graph)
Kegunaan: Ini adalah inti/jantung dari seluruh program. Fungsi ini menghitung rute terpendek/tercepat menggunakan Algoritma Dijkstra dari satu titik asal ke satu titik tujuan spesifik.
Komponen di Dalamnya:
vector<int> distance: Menyimpan catatan akumulasi waktu/jarak terpendek sementara dari node asal ke node lainnya. Diinisialisasi dengan nilai tak hingga (INT_MAX).vector<int> parent: Peta ingatan untuk mencatat "sebelum ke node X, kita paling cepat lewat node mana?". Ini digunakan oleh fungsiprintPath.priority_queue<...>(Min-Heap): Antrean prioritas yang otomatis menempatkan node dengan bobot akumulasi terkecil di posisi paling atas (pq.top()), sehingga program selalu mengeksplorasi jalur paling menjanjikan terlebih dahulu.
Optimasi Penting: Ada baris
if (currentNode == destination) break;. Artinya, jika antrean prioritas sudah mengangkat node tujuan kita, algoritma akan langsung berhenti saat itu juga tanpa perlu memeriksa sisa node lain yang tidak penting.
int main()
Kegunaan: Menjadi pintu masuk utama program sekaligus pengatur antarmuka interaktif dengan pengguna.
Tugas Utamanya:
Meminta input jumlah total node dan edge dari pengguna.
Membangun struktur graf dalam bentuk Adjacency List (
vector<vector<Edge>> graph).Mengamankan program dari crash melalui validasi batas indeks (
if (u < 0 || u >= nodes ...)). Jika kamu memasukkan nomor node yang tidak terdaftar, program tidak akan eror, melainkan memintamu mengulang input.Menerima input titik awal dan akhir, lalu memanggil fungsi
dijkstra().
2. Kegunaan dan Filosofi Algoritma Dijkstra
Algoritma Dijkstra adalah algoritma Greedy yang dirancang untuk mencari lintasan terpendek (single-source shortest path) dari satu titik acuan ke titik-titik lain pada graf yang memiliki bobot edge bernilai positif >=0.
Dalam konteks kode yang kamu tulis, kegunaan praktisnya meliputi:
Navigasi Gps / Maps: Menemukan rute perjalanan dari titik A ke titik B dengan akumulasi lampu merah atau kemacetan (bobot/waktu) paling minimal.
Routing Jaringan Komputer: Mengirimkan paket data dari komputer pengirim ke komputer penerima melalui jalur router yang memiliki latensi (ping) paling kecil agar transfer data super cepat.
Logistik dan Distribusi: Membantu kurir atau armada pengiriman barang memilih kombinasi jalan raya yang menghemat waktu tempuh dan bahan bakar.
Mengapa algoritma ini sangat efisien?
Dibandingkan mencoba semua kemungkinan rute satu per satu (Brute Force) yang memakan waktu lama, Dijkstra menerapkan prinsip Relaksasi.
Setiap kali ia menemukan jalur baru menuju suatu node yang ternyata menghasilkan total waktu lebih kecil daripada catatan waktu lama, ia langsung memperbarui data di dalam tabel distance dan parent-nya. Berkat bantuan priority_queue, algoritma ini bekerja dengan efisiensi waktu sebesar O((V + E) \log V), di mana V adalah jumlah Node dan E adalah jumlah Edge.
Komentar
Posting Komentar