【问题标题】:Longest acyclic path in a directed unweighted graph有向无权图中的最长非循环路径
【发布时间】:2010-03-26 17:26:58
【问题描述】:

什么算法可以用来在未加权的有向无环图中找到最长的路径?

【问题讨论】:

    标签: algorithm graph


    【解决方案1】:

    Dynamic programming。在Longest path problem 中也引用了它,因为它是一个 DAG。

    以下代码来自维基百科:

    algorithm dag-longest-path is
        input: 
             Directed acyclic graph G
        output: 
             Length of the longest path
    
        length_to = array with |V(G)| elements of type int with default value 0
    
        for each vertex v in topOrder(G) do
            for each edge (v, w) in E(G) do
                if length_to[w] <= length_to[v] + weight(G,(v,w)) then
                    length_to[w] = length_to[v] + weight(G, (v,w))
    
        return max(length_to[v] for v in V(G))
    

    【讨论】:

    • 这仅返回路径的长度。是否可以轻松修改代码以返回路径?
    • 是的,大多数 DP 问题都采用同样的方式——跟踪前一个问题并返回。
    • topOrder(G)topological order中G的顶点列表
    • 因此循环从“源”(没有传入边缘)开始,以“接收器”(没有传出边缘)结束
    • a paper with same algorithm 但如果您需要,更容易遵循基本原理。
    【解决方案2】:

    只要图是非循环的,您需要做的就是否定边权重并运行任何最短路径算法。

    编辑:显然,您需要一个支持负权重的最短路径算法。此外,来自维基百科的算法似乎具有更好的时间复杂度,但我将把答案留在这里以供参考。

    【讨论】:

    • 我们是否将负权重设为负数? :p
    • @Hellnar:不,如果您在原始图中有负权重,它们应该变成正数。 w' = -(w)
    【解决方案3】:

    维基百科有一个算法:http://en.wikipedia.org/wiki/Longest_path_problem

    看起来他们使用权重,但应该使用所有设置为 1 的权重。

    【讨论】:

      【解决方案4】:

      可以通过关键路径法解决:
      1. 求拓扑排序
      2.找到关键路径
      参见 [Horowitz 1995],C++ 数据结构基础,计算机科学出版社,纽约。

      无论如何,贪婪策略(例如 Dijkstra)都行不通:1。使用“max”而不是“min” 2. 将正权重转换为负权 3. 给出一个非常大的数字 M 并使用 M-w 作为权重。

      【讨论】:

        猜你喜欢
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 2019-02-15
        • 1970-01-01
        • 2020-10-13
        • 1970-01-01
        • 2013-03-02
        • 1970-01-01
        相关资源
        最近更新 更多