DAGで最長のパスを見つけるために、私は2つのアルゴリズムを知っています。アルゴリズム1:トポロジカルソートを実行し、ソートの結果に対して動的プログラミングを使用します〜または〜アルゴリズム2:DFSを使用してDAG内のすべてのパスを列挙します。最長を記録します。DFSですべてのパスを列挙する方が、アルゴ1よりも複雑なようです。それは本当ですか?
25848 次
3 に答える
10
2 番目のオプションは正しくありません。グラフがツリーまたはフォレストであり、ルートから開始しない限り、DFS は可能なすべてのパスを探索しません。私が知っている 2 番目のアルゴリズムは、重みを無効にして最短経路を見つけることですが、#1 として挙げたトップ ソート + DP アルゴリズムよりもやや遅くなります。
于 2012-05-23T02:14:03.533 に答える
3
「DFS」を使用して DAG 内のすべてのパスを列挙します。
import numpy as np
def enumerate_dag(g):
def enumerate_r(n, paths, visited, a_path = []):
a_path += [n]
visited[n] = 1
if not g[n]:
paths += [list(a_path)]
else:
for nn in g[n]:
enumerate_r(nn, paths, visited, list(a_path))
paths, N = [], len(g)
visited = np.zeros((N), dtype='int32')
for root in range(N):
if visited[root]: continue
enumerate_r(root, paths, visited, [])
return paths
于 2012-05-23T03:39:49.413 に答える
2
DFS は必要ありません。アルゴリズム : DAG G を受け取ります。各アークは 1 つの変数 E を保持します
for each node with no predecessor :
for each of his leaving arcs, E=1.
for each node whose predecessors have all been visited :
for each of his leaving arcs, E=max(E(entering arcs))+1.
max_path は、すべてのノードが処理されたときのエッジ内の最大 E です。
于 2012-05-24T12:29:22.057 に答える