2012-05-23 53 views
9

DAGで最も長いパスを見つけるには、2つのアルゴリズムがあります。algo 1:トポロジカルソート+ソートの結果に動的プログラミングを使用する〜または〜algo 2:すべてを列挙するDAGを使用してDAGのパスを記録し、最も長い時間を記録します。 DFSのすべてのパスを列挙すると、algo 1よりも複雑になります。それは本当ですか?DAG内で最長のパス

+0

[CS.SE]関連:[DAG内の2つの頂点間の最短経路と最長経路の検索](http://cs.stackexchange.com/q/11295/11177) – Palec

答えて

8

2番目のオプションが正しくありません。DFSは、グラフがツリーまたはフォレストで、ルートから開始しない限り、すべての可能なパスを探索しません。私が知っている2番目のアルゴリズムは、ウェイトを無効にして最短経路を見つけることですが、#1としてリストアップしたtop sort + DP algorithmよりもいくらか遅いです。 "DFS" を使用してDAGで

+0

OK、以前のDFSで訪問されていない頂点はすべて通過します。それはDAG全体を探るでしょう。トポソート+ DPより速いはずですか? – Frank

+0

@Frank訪問していない頂点からの再起動を伴うDFSは、すべてのパスを探索するわけではありません。グラフ「A-> B-> C」を考える。あなたはBからDFSを開始し、Cに行き、停止します。それからCをもう一度訪問したので、Aから再起動してBに行き、もう一度停止します。 DFSが発見した 'B-C'と' A-B'の両方のパスは長さが1です。最長の経路「A-B-C」の長さは2です。 – dasblinkenlight

+0

なぜあなたはBから始めるでしょうか?ソースからDFSを起動する必要があります。 – Frank

3

列挙すべてのパス:

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 
+1

ダブルダイヤモンドグラフをこのコードに渡してみましたか?最長のパスを逃す確率は50/50であるようです。 – dasblinkenlight

+0

私は[[1,2]、[3]、[3]、[4]、[5,6]、[7]、[7]、[8]、[9]、[ ]]。私は4つのパスを取得します:[[0,1,3,4,5,7,8,9]、[0,1,3,4,6,7,8,9]、[0,2,3,4 、[5、7、8、9]、[0,2,3,4,6,7,8,9]]、私は正解であると信じています。私が知る限り(他の多くのテストから)、このアルゴリズムはDAG内のパスを正しく列挙します。 Topoソートは、DFSと非常によく似ています。ソースで開始/再開すると、DFSは各ソースから到達可能なすべてのノードを探索します。したがって、上のコードは完全にDAGを探索します。頂点は欠落しません。 – Frank

+0

私はあなたのコードで 'visited'の使用を誤解しました。あなたはそれを設定しましたが、それを使ってトラバースを続けるべきかどうかを決めることはありません。 DFSは完全に探索されたノードを訪問しないので、これは[DFS](http://en.wikipedia.org/wiki/Depth-first_search)と呼ばれるものではありません。 DFSとコードの最大の違いは、コードが非常に非効率的であることです。同じダイヤモンドパターンを50回繰り返して、私の意図を確認してください:あなたのプログラムはすべての '2^50'パスを探索するでしょう。それは探索する道のりです。 – dasblinkenlight

2

ませんDFSは必要。 アルゴリズム:MAX_PATHは、すべてのノードが処理されたエッジの中で一番高い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. 

各アークは、一つの変数Eを保持DAG G. をとります。

+0

これは正解です。 https://en.wikipedia.org/wiki/Longest_path_problem#Acyclic_graphs_and_critical_pathsを参照してください。 –

関連する問題