Warning: file_get_contents(/data/phpspider/zhask/data//catemap/4/algorithm/12.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Algorithm 从源节点开始查找具有最大权重或增益的给定长度的路径_Algorithm_Graph_Tree - Fatal编程技术网

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

Algorithm 从源节点开始查找具有最大权重或增益的给定长度的路径,algorithm,graph,tree,Algorithm,Graph,Tree,您好,谢谢您的阅读 给定一个由N个顶点和e个边组成的无向树,其奖励点为p_e,起始顶点为s,整数为M 然后我们必须找到: 从s开始并遍历M条边可以获得的最大点数 一条边可以被遍历多次 请引导我朝正确的方向解决这个问题。首先,让我们观察一下,如果在最佳解决方案中多次遍历某些边,那么所有这些边都将获得相同的回报(否则,以更大的回报多次遍历边将更有利)。因此,在不损失慷慨的情况下,我们可以说,你将多次穿过一条边 第二,您将多次遍历的边将是您最佳路径中所有边中回报最大的边。否则,它会更有利可图,遍历一个

您好,谢谢您的阅读

给定一个由N个顶点和e个边组成的无向树,其奖励点为p_e,起始顶点为s,整数为M

然后我们必须找到: 从s开始并遍历M条边可以获得的最大点数

一条边可以被遍历多次


请引导我朝正确的方向解决这个问题。

首先,让我们观察一下,如果在最佳解决方案中多次遍历某些边,那么所有这些边都将获得相同的回报(否则,以更大的回报多次遍历边将更有利)。因此,在不损失慷慨的情况下,我们可以说,你将多次穿过一条边

第二,您将多次遍历的边将是您最佳路径中所有边中回报最大的边。否则,它会更有利可图,遍历一个更大的回报,路径将不会是最优的。因此,要多次遍历的边将是路径中的最后一条边

因此,这里有一个简单的算法:查看树中距离起点不超过M的所有顶点,找到从s到每个顶点的奖励点的总和,无需重复边(这个数字将以唯一的方式确定,因为树中每对顶点之间只有一条路径),并用剩下的M边遍历边缘,得到最大的奖赏(每次我们认为这个边是当前路径中使用的最后一个边)。 您可以使用或

下面是一个伪代码:

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)
}
你会打电话的
遍历(0,0,0,-INF)
然后从
ans
获取结果