My first Magazine pemrograman-kompetitif-dasar | Page 136

11 Algoritma Graf Optimisasi ini membuat kompleksitas algoritma Dijkstra berjalan dalam O((V + E) logV ). 11.1.2 Bellman—Ford Konsep Untuk mengatasi kekurangan algoritma Dijkstra pada graf dengan bobot negatif, kita dapat menggunakan algoritma Bellman—Ford. Algoritma ini menerima input berupa graf dan sebu- ah node awal, misalnya s, dan mengembalikan shortest path dari s ke seluruh node lainnya. Algoritma ini juga memberikan kemampuan tambahan berupa pendeteksian negative cycle . Negative cycle merupakan cycle pada graf berbobot yang jumlah bobotnya negatif. Ketika negative cycle dapat dicapai dari suatu node awal dan dapat menuju ke suatu node akhir, maka shortest path dari kedua node tersebut menjadi tidak terdefinisi. Sebab, perjalanan dari node awal ke node akhir dapat berputar-putar di negative cycle sambil terus mengurangi bobot perjalanannya. Gambar 11.9 menunjukkan contoh graf dengan negative cycle . 6 1 2 -5 4 1 2 3 3 5 2 Gambar 11.9: Contoh graf yang memiliki negative cycle , yaitu [2, 3, 4]. Shortest path dari 1 ke 5 tidak terdefinisi karena adanya negative cycle . Ide dari algoritma Bellman—Ford adalah terus menerus melakukan proses relax , sampai pada akhirnya tidak ada perubahan bobot perjalanan dan shortest path yang benar ditemukan. Observasi yang dimanfaatkan algoritma ini adalah, shortest path dari suatu node ke node lainnya dipastikan tidak melibatkan lebih dari V − 1 edge . Artinya apabila sebanyak V − 1 kali seluruh edge di-relax , maka seluruh shortest path akan ditemukan. Dengan demikian, algoritma ini dapat disimpulkan menjadi: sebanyak V − 1 kali, relax seluruh edge . Untuk mendeteksi keberadaan negative cycle , kita dapat melakukan relax tambahan seba- nyak satu kali. Jika masih terdapat bobot perjalanan yang berubah, dipastikan perubahan itu disebabkan oleh negative cycle . Implementasi Representasi graf yang cocok digunakan adalah edge list atau adjacency list , untuk men- dapatkan informasi seluruh edge secara efisien. Algoritma 65 menunjukkan implementasinya, sementara Algoritma 66 menunjukkan fungsi tambahan untuk mendeteksi keberadaan negative cycle . Algoritma 65 Implementasi algoritma Bellman—Ford. 1: 2: function B ELLMAN -F ORD (s) dist ← new integer[V + 1] 3: 4: 126 FILL A RRAY (dist, ∞) dist[s] ← 0