代码之家  ›  专栏  ›  技术社区  ›  Martín Fixman

这个算法是如何在有向非循环图上找到最大路径的?

  •  5
  • Martín Fixman  · 技术社区  · 16 年前

    因为有一段时间,我使用了一个复杂度为o(v+e)的算法来查找从点A到点B的有向非循环图上的最大路径,这包括执行洪水填充来查找从注释A可以访问的节点,以及每个节点有多少“父节点”(来自其他节点的边)。然后,我做一个bfs,但只“激活”一个节点,当我已经使用了它的所有“父节点”。

    queue <int> a
    int paths[] ; //Number of paths that go to note i
    int edge[][] ; //Edges of a
    int mpath[] ; //max path from 0 to i (without counting the weight of i)
    int weight[] ; //weight of each node
    
    mpath[0] = 0
    
    a.push(0)
    while not empty(a)
        for i in edge[a]
            paths[i] += 1
            a.push(i)
    
    while not empty(a)
        for i in children[a]
            mpath[i] = max(mpath[i], mpath[a] + weight[a]) ;
    
            paths[i] -= 1 ;
            if path[i] = 0
                a.push(i) ;
    

    这个算法有什么特别的名字吗?我把它告诉了一位信息学教授,他只是把它称为“DAG上的最大路径”,但当你说“我用芬威克树解决了第一个问题,用dijkstra解决了第二个问题,用最大路径解决了第三个问题”时,听起来不太好。

    3 回复  |  直到 16 年前
        1
  •  3
  •   Larry    16 年前

    正如其他人提到的,这只是“DAG中最长的路径”。然而,你使用的技术实际上是 topological sorting 具有 dynamic programming .

        2
  •  2
  •   ima    16 年前

    可能不是-因为这不是一个常见的算法。当您需要在DAG中找到路径时,您只需对其进行排序、遍历一次并保持最长的路径。

        3
  •  1
  •   Aryabhatta    16 年前

    最长的路?一定要提到达格。在一般图中寻找最长路径是NP完全的。