Bir ağaçta kökten yaprağa en uzun yolu bulun


15

Aşağıdaki örnek gibi bir ağaç (grafik teorisi anlamda) var:

resim açıklamasını buraya girin

Bu, bir başlangıç ​​düğümü (kök) ve birçok bitiş düğümü (yaprakları) olan yönlendirilmiş bir ağaçtır. Her kenarın kendisine atanmış bir uzunluğu vardır.

Benim sorum, kökten başlayıp yapraklardan herhangi birinde biten en uzun yolu nasıl bulabilirim? Kaba kuvvet yaklaşımı tüm kök-yaprak yollarını kontrol etmek ve maksimum uzunluklu olanı almaktır, ancak varsa daha verimli bir algoritmayı tercih ederim.


Yanıtlar:


16

Ran G., etkili bir algoritmaya yönelik ipuçları verdi, ancak belki de bazı ayrıntıları dışarıda bıraktı. Tekrar tekrar çalışıyorsanız, örneğin her yolu hesaplayıp uzunluğunu hesaplarsanız, tüm kök yaprak yollarının hesaplanması gerçekten biraz verimsiz olur.

Aşağıdaki özyinelemeli algoritmayı kullanarak LongestPath(root)istediğinizi verir. Esasen, her bir alt ağaç için özyineli olarak en uzun yolu hesaplar. Her düğümde bu, yeni yolların oluşturulmasını ve en uzun yolun döndürülmesini gerektirir.

 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

Bu bazı Haskell gösterimi ile sözde kod bir kombinasyon, bu yüzden umarım anlaşılabilir.

Sitemizi kullandığınızda şunları okuyup anladığınızı kabul etmiş olursunuz: Çerez Politikası ve Gizlilik Politikası.
Licensed under cc by-sa 3.0 with attribution required.