如何在加权图中找到具有最大权重总和的路径?

时间:2011-08-08 23:35:54

标签: python algorithm graph

我有一堆对象,其级别,权重和0或更多连接到下一级别的对象。我想知道如何获得“最重的”路径(具有最大权重总和)。

我当然也很想知道,有哪些书教会我如何以实际的方式处理图形。

4 个答案:

答案 0 :(得分:6)

你的图表是非循环的吗? (我认为是这样,因为节点总是指向下一级别的节点)。如果你的图形可以有一个arbritrary周期,那么找到最大路径的问题就变成NP完全,而强力搜索成为唯一的解决方案。

回到问题 - 你可以通过为每个节点找到导致它的最重的路径来解决这个问题。由于你已经有了DAG的拓扑类型(这些级别本身),因此找到路径是很好的:

  1. 对于每个节点,存储导致它的最重路径的成本以及所述路径上的最后一个节点。最初,这总是空的(但是一个标记值,比如成本的负数,可能会在以后简化代码)

  2. 对于第一级中的节点,您已经知道以它们结尾的最重路径的成本 - 它为零(并且父节点为None

  3. 对于每个级别,将路径信息传播到下一级别 - 这类似于最短距离的普通算法:

    for level in range(nlevels):
        for node in nodes[level]:
            cost = the cost to this node
             for (neighbour_vertex, edge_cost) in (the nodes edges):
                 alt_cost = cost + edge_cost
                 if  alt_cost < cost_to_that_vertex:
                     cost_to_that_vertex = alt_cost
    

答案 1 :(得分:2)

我的书推荐是Steve Skiena的"Algorithm Design Manual"。关于图表有一个很好的章节。

答案 2 :(得分:2)

我认为你只能在图表中找到较低的水平。

注意图形如何形成树。然后你可以使用递归来解决这个问题:

heaviest_path(node n) = value[n] + max(heaviest_path(children[n][0]), heaviest_path(children[n][1]), etc)

这可以通过使用动态编程轻松优化。

从最低级别的孩子开始。他们的heaviest_path只是他们自己的价值。在数组中跟踪这个。然后计算heaviest_path然后再升级。然后上一级。等

答案 3 :(得分:0)

我通常用来找到“最重”路径的方法是否定权重然后找到最短路径。有很好的算法(http://en.wikipedia.org/wiki/Shortest_path_problem)来找到最短的路径。但只要您的原始图表中没有正权重循环,此方法就会很好。

对于具有正权重周期的图,找到“最重”路径的问题是NP完全的,找到最重路径的算法将具有非多项式时间复杂度。