木の根から葉までの最長経路を見つける


15

次の例のようなツリーがあります(グラフ理論の意味で)。

ここに画像の説明を入力してください

これは、1つの開始ノード(ルート)と多くの終了ノード(リーフ)を持つ有向ツリーです。各エッジには長さが割り当てられています。

私の質問は、ルートで始まり葉のいずれかで終わる最長パスをどのように見つけるかです。ブルートフォースアプローチは、すべてのルートリーフパスをチェックし、最大長のパスを取得することですが、1つあればより効率的なアルゴリズムを好むでしょう。


回答:


16

Ran G.は効率的なアルゴリズムにヒントを与えましたが、おそらく彼はいくつかの詳細を省略しました。すべてのルートリーフパスを計算することは、たとえば各パスを計算してから長さを計算する場合など、何度も作業を繰り返している場合、実際には少し非効率的です。

で始まる次の再帰アルゴリズムを実行するLongestPath(root)と、必要なものが得られます。基本的に、各サブツリーの最長パスを再帰的に計算します。各ノードでこれを行うには、新しいパスを構築し、最も長いパスを返す必要があります。

 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

これは、Haskell表記と疑似コードの組み合わせであるため、わかりやすいものであることを願っています。

弊社のサイトを使用することにより、あなたは弊社のクッキーポリシーおよびプライバシーポリシーを読み、理解したものとみなされます。
Licensed under cc by-sa 3.0 with attribution required.