我有一堆对象,其级别,权重和0或更多连接到下一级别的对象。我想知道如何获得“最重的”路径(具有最大权重总和)。
我当然也很想知道,有哪些书教会我如何以实际的方式处理图形。
答案 0 :(得分:6)
你的图表是非循环的吗? (我认为是这样,因为节点总是指向下一级别的节点)。如果你的图形可以有一个arbritrary周期,那么找到最大路径的问题就变成NP完全,而强力搜索成为唯一的解决方案。
回到问题 - 你可以通过为每个节点找到导致它的最重的路径来解决这个问题。由于你已经有了DAG的拓扑类型(这些级别本身),因此找到路径是很好的:
对于每个节点,存储导致它的最重路径的成本以及所述路径上的最后一个节点。最初,这总是空的(但是一个标记值,比如成本的负数,可能会在以后简化代码)
对于第一级中的节点,您已经知道以它们结尾的最重路径的成本 - 它为零(并且父节点为None
)
对于每个级别,将路径信息传播到下一级别 - 这类似于最短距离的普通算法:
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完全的,找到最重路径的算法将具有非多项式时间复杂度。