DAG中最长的路径

时间:2012-05-23 01:50:52

标签: algorithm graph directed-acyclic-graphs

要找到DAG中最长的路径,我知道2种算法:算法1:进行拓扑排序+对排序结果使用动态编程〜或〜算法2:枚举DAG中的所有路径使用DFS,记录时间最长。似乎枚举DFS的所有路径都比算法更复杂。这是真的吗?

3 个答案:

答案 0 :(得分:8)

您的第二个选项不正确:DFS不会探索所有可能的路径,除非您的图形是树或森林,并且您从根开始。我知道的第二种算法是否定权重并找到最短路径,但它比你列为#1的top sort + DP algorithm慢一些。

答案 1 :(得分:3)

使用“DFS”枚举DAG中的所有路径:

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

答案 2 :(得分:2)

不需要DFS。 算法:采用DAG G. 每个弧保持一个变量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。