重み付けされていない有向非巡回グラフで最長のパスを見つけるために使用できるアルゴリズムは何ですか?
動的計画法 。また、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))
グラフが非巡回である限り、必要なのはエッジの重みを無効にして最短経路アルゴリズムを実行することだけです。
EDIT:明らかに、負の重みをサポートする最短経路アルゴリズムが必要です。また、ウィキペディアのアルゴリズムの方が時間計算量が多いようですが、参考のためにここに答えを残しておきます。
ウィキペディアにはアルゴリズムがあります: http://en.wikipedia.org/wiki/Longest_path_problem
重み付けを使用しているように見えますが、すべて1に設定された重み付けで機能するはずです。
クリティカルパス法で解決できます。
1。トポロジカル順序を見つける
2。クリティカルパスを見つける
[Horowitz 1995]、C++のデータ構造の基礎、Computer Science Press、ニューヨークを参照してください。
貪欲な戦略(ダイクストラなど)は、関係なく機能しません:1。 「最小」の代わりに「最大」を使用します。2。正の重みを負に変換します。3。非常に大きな数Mを指定し、重みとしてM-wを使用します。