Longest path in a DAG

前端 未结 3 957
小蘑菇
小蘑菇 2020-12-09 18:58

To find the longest path in a DAG, I\'m aware of 2 algorithms: algo 1: do a topological sort + use dynamic programming on the result of the sort ~ or ~ algo 2: enumerate all

相关标签:
3条回答
  • 2020-12-09 19:44

    No DFS needed. Algorithm : takes a DAG G. Each arc holds one variable 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 is the highest E within edges when all nodes have been processed.

    0 讨论(0)
  • 2020-12-09 19:54

    Your second option is incorrect: DFS does not explore all possible paths, unless your graph is a tree or a forest, and you start from the roots. The second algorithm that I know is negating the weights and finding the shortest path, but it is somewhat slower than the top sort + DP algorithm that you listed as #1.

    0 讨论(0)
  • 2020-12-09 19:56

    Enumerate all paths in a DAG using "DFS":

    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
    
    0 讨论(0)
提交回复
热议问题