web-dev-qa-db-ja.com

有向非巡回グラフの最長の非巡回パス

重み付けされていない有向非巡回グラフで最長のパスを見つけるために使用できるアルゴリズムは何ですか?

21
Hellnar

動的計画法 。また、DAGであるため、 最長パスの問題 でも参照されます。

ウィキペディアからの次のコード:

algorithm dag-longest-path is
    input: 
         Directed acyclic graph G
    output: 
         Length of the longest path

    length_to = array with |V(G)| elements of type int with default value 0

    for each vertex v in topOrder(G) do
        for each Edge (v, w) in E(G) do
            if length_to[w] <= length_to[v] + weight(G,(v,w)) then
                length_to[w] = length_to[v] + weight(G, (v,w))

    return max(length_to[v] for v in V(G))
25
Larry

グラフが非巡回である限り、必要なのはエッジの重みを無効にして最短経路アルゴリズムを実行することだけです。

EDIT:明らかに、負の重みをサポートする最短経路アルゴリズムが必要です。また、ウィキペディアのアルゴリズムの方が時間計算量が多いようですが、参考のためにここに答えを残しておきます。

6
Can Berk Güder

ウィキペディアにはアルゴリズムがあります: http://en.wikipedia.org/wiki/Longest_path_problem

重み付けを使用しているように見えますが、すべて1に設定された重み付けで機能するはずです。

2
Dan

クリティカルパス法で解決できます。
1。トポロジカル順序を見つける
2。クリティカルパスを見つける
[Horowitz 1995]、C++のデータ構造の基礎、Computer Science Press、ニューヨークを参照してください。

貪欲な戦略(ダイクストラなど)は、関係なく機能しません:1。 「最小」の代わりに「最大」を使用します。2。正の重みを負に変換します。3。非常に大きな数Mを指定し、重みとしてM-wを使用します。

1
Monkeycanfly