DAGで最も長いパスを見つけるには、2つのアルゴリズムがあります。algo 1:トポロジカルソート+ソートの結果に動的プログラミングを使用する〜または〜algo 2:すべてを列挙するDAGを使用してDAGのパスを記録し、最も長い時間を記録します。 DFSのすべてのパスを列挙すると、algo 1よりも複雑になります。それは本当ですか?DAG内で最長のパス
答えて
2番目のオプションが正しくありません。DFSは、グラフがツリーまたはフォレストで、ルートから開始しない限り、すべての可能なパスを探索しません。私が知っている2番目のアルゴリズムは、ウェイトを無効にして最短経路を見つけることですが、#1としてリストアップしたtop sort + DP algorithmよりもいくらか遅いです。 "DFS" を使用してDAGで
OK、以前のDFSで訪問されていない頂点はすべて通過します。それはDAG全体を探るでしょう。トポソート+ DPより速いはずですか? – Frank
@Frank訪問していない頂点からの再起動を伴うDFSは、すべてのパスを探索するわけではありません。グラフ「A-> B-> C」を考える。あなたはBからDFSを開始し、Cに行き、停止します。それからCをもう一度訪問したので、Aから再起動してBに行き、もう一度停止します。 DFSが発見した 'B-C'と' A-B'の両方のパスは長さが1です。最長の経路「A-B-C」の長さは2です。 – dasblinkenlight
なぜあなたはBから始めるでしょうか?ソースからDFSを起動する必要があります。 – Frank
列挙すべてのパス:
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
ダブルダイヤモンドグラフをこのコードに渡してみましたか?最長のパスを逃す確率は50/50であるようです。 – dasblinkenlight
私は[[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
私はあなたのコードで 'visited'の使用を誤解しました。あなたはそれを設定しましたが、それを使ってトラバースを続けるべきかどうかを決めることはありません。 DFSは完全に探索されたノードを訪問しないので、これは[DFS](http://en.wikipedia.org/wiki/Depth-first_search)と呼ばれるものではありません。 DFSとコードの最大の違いは、コードが非常に非効率的であることです。同じダイヤモンドパターンを50回繰り返して、私の意図を確認してください:あなたのプログラムはすべての '2^50'パスを探索するでしょう。それは探索する道のりです。 – dasblinkenlight
ません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. をとります。
これは正解です。 https://en.wikipedia.org/wiki/Longest_path_problem#Acyclic_graphs_and_critical_pathsを参照してください。 –
- 1. 各ノードのBST内の最長パス
- 2. NetworkX最も効率的な方法で、開始点でエラーなしでDAG内で最長のパスを見つける方法
- 3. グラフ - ダイクストラシングルソース最長パスの
- 4. Javaコードの最長パス
- 5. 疎循環グラフ内で最も長い単純パス
- 6. BFSで最長のパスを探す
- 7. Javaのkeytoolの最大パス長
- 8. BSTの最長パスの平均
- 9. Floyd/Warshallアルゴリズム最長のパスで最も安いパスを見つけるmod
- 10. DAGのノードを通過する最短パスの数を数えます
- 11. パイソン - 見つける最長パス
- 12. グリッド内の最適なパス
- 13. バイナリツリー内で最も長い連続パスを見つける方法
- 14. 長方形のグリッドで最短のパスをコーナーにコーナー
- 15. DAG内のドミネーターをインクリメンタルに検出
- 16. cypherクエリで最長のパスを見つける方法
- 17. 2つの頂点の間の最長のパス
- 18. ファイル内で最短と最長のシーケンスを得る
- 19. ビットストリング内の最長ゼロシーケンスの検索
- 20. 単語内の最長の文字列
- 21. DLL内の関数名の最大長
- 22. フォルダーのパスのシリアル化の最大文字長
- 23. Visual Studioとプロジェクト参照のパスの最大長
- 24. Mac OS Xの最長パス名文字列HFS +
- 25. Mac OS X Lion:最大パスの長さは?
- 26. 赤い黒い木の内部のパスの長さ
- 27. 「ツリー内の最長パス」を見つけるには、次の方法が正しいですか?
- 28. UnixでのDirPickerCtrlのパス長maxiumum
- 29. Javaジャージー可変長のパス
- 30. SteamID64の最小長と最大長
[CS.SE]関連:[DAG内の2つの頂点間の最短経路と最長経路の検索](http://cs.stackexchange.com/q/11295/11177) – Palec