从源节点开始查找具有最大权重或增益的给定长度的路径

时间:2015-05-11 16:25:21

标签: algorithm graph tree

您好,感谢您阅读本文。

给定N个顶点和e边缘的无向树以及相关的奖励点P_e,起始顶点:s和一个整数:M

然后我们必须找到: 我们可以通过从s开始并遍历M个边来获得最多的点数。

可以多次遍历边缘。

请指导我正确的方向来解决这个问题。

1 个答案:

答案 0 :(得分:0)

首先让我们观察一下,如果你在最优解决方案中多次遍历某些边缘,那么所有这些边缘将具有相同的奖励(否则以更多的奖励遍历边缘更有利)。因此,在不失去慷慨的情况下,我们可以说您将多次遍历一条边。

其次,您将多次遍历的边缘将成为最佳路径中所有边缘中获得最大回报的边缘。否则再次以更大的奖励越过那个并且路径不是最佳的将更有利可图。因此,您将多次遍历的边将成为路径中的最后一条边。

所以这是一个简单的算法:查看树的所有顶点,这些顶点距起点不是M,找到从s到每个顶点的奖励点之和,没有边重复(这个数字将会由于在树中的每对顶点之间只有一条路径,所以只能确定,并使用M个边缘的其余部分以最大的奖励遍历边缘(每次我们认为这个边缘是最后一个我们在当前路径中使用。)

您可以使用BFSDFS

这是一个伪代码:

ans = -INF

traverse(vertex, pathLength, pathReward, lastEdge) {
    if (visited(vertex)) // Do not visit a vertex twice
        return;
    if (pathLength > 0)
        ans = max(ans, pathReward + (M - pathLength) * lastEdge)
    if (pathLength == M) // We cannot go farther than M edges
        return;
    for (vertex, nextVertex) in edges:
        edgeReward = edgeReward(vertex, nextVertex)
        traverse(nextVertex, pathLength + 1, pathReward + edgeReward, edgeReward)
}

你会打电话     traverse(0, 0, 0, -INF) 然后从ans获得结果。