Saya punya pohon (dalam arti teori grafik), seperti contoh berikut:
Ini adalah pohon terarah dengan satu simpul mulai (root) dan banyak simpul akhir (daun). Masing-masing ujung memiliki panjang yang ditetapkan untuk itu.
Pertanyaan saya adalah, bagaimana cara menemukan jalan terpanjang mulai dari akar dan berakhir di salah satu daun? Pendekatan brute-force adalah untuk memeriksa semua jalur root-leaf dan mengambil yang dengan panjang maksimal, tapi saya lebih suka algoritma yang lebih efisien jika ada.
algorithms
graphs
Graviton
sumber
sumber
Jawaban:
Ran G. memberi petunjuk ke arah algoritma yang efisien, meskipun mungkin dia tidak menyebutkan beberapa detail. Menghitung semua jalur root-root memang sedikit tidak efisien jika Anda melakukan pekerjaan berulang-ulang, misalnya, jika Anda menghitung setiap jalur dan kemudian menghitung panjangnya.
Lakukan algoritma rekursif berikut dimulai dengan
LongestPath(root)
akan memberikan apa yang Anda inginkan. Pada dasarnya, ini secara rekursif menghitung jalur terpanjang untuk setiap subtree. Pada setiap node ini membutuhkan membangun jalur baru dan mengembalikan yang terpanjang.Ini adalah kombinasi jika pseudo-code dengan beberapa notasi Haskell, jadi saya harap ini dapat dipahami.
sumber