Temukan jalur terpanjang dari akar ke daun di pohon

15

Saya punya pohon (dalam arti teori grafik), seperti contoh berikut:

masukkan deskripsi gambar di sini

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.

Graviton
sumber
Pertanyaan terkait .
Raphael

Jawaban:

16

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.

 LongestPath(node)
   If node is a leaf, return (node,0) 
   If node is not a leaf:  
    For each edge (node,length,next):
       Let (p,l) = LongestPath(next)
       Let (path,len) = (p++[next], l + length)
    Return element (path,len) from previous step with largest value len

Ini adalah kombinasi jika pseudo-code dengan beberapa notasi Haskell, jadi saya harap ini dapat dipahami.

Dave Clarke
sumber