Algorithm 从源节点开始查找具有最大权重或增益的给定长度的路径
您好,谢谢您的阅读 给定一个由N个顶点和e个边组成的无向树,其奖励点为p_e,起始顶点为s,整数为M 然后我们必须找到: 从s开始并遍历M条边可以获得的最大点数 一条边可以被遍历多次Algorithm 从源节点开始查找具有最大权重或增益的给定长度的路径,algorithm,graph,tree,Algorithm,Graph,Tree,您好,谢谢您的阅读 给定一个由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
获取结果