通过某些已定义节点的最短路径

时间:2017-11-12 19:12:35

标签: algorithm dijkstra

在有向图中,找到从s到t的最短路径,使路径通过V的某个子集,让我们称之为死亡节点。算法给出一个数n,当从s到t遍历时,该路径不能超过n个死亡节点。她找到最短路径的最佳方法是什么?我正在削弱Dijkstra,但是如何确保我们不会超过n个节点?请帮我调整Dijkstra's以包含这个条件。

2 个答案:

答案 0 :(得分:1)

小n

如果n很小,你可以复制你的图形,称它们为1到n级。

从级别1的s开始。如果您处于正常节点,则边缘会将您带到同一级别的节点。如果您处于死亡节点,则边缘会将您带到下一级别的节点。如果你在n级的死亡节点,则边缘被省略。

还将所有级别的t节点连接到新的单个目标T(零权重)。

然后计算从s到T的最短路径。

这种方法的问题是图形大小上升了n倍,所以它只适用于小n。

大n

另一种方法是增加每个边缘的权重,使变量x留下死亡节点。

当您增加变量x时,最短路径将使用越来越少的死亡节点。调整x的值(例如,使用二分法),直到图形仅使用n个死亡节点。

这应该采用最短路径的O(logn)评估。

答案 1 :(得分:0)

我将路上遇到的死节点数作为计算距离的新(稀疏)维度添加 - 基本上每个节点最多有n个最佳距离。

实现你自己的BFS将是类似的:你需要对每个节点处理“看到x死节点”不同于“看到y死节点”,除非路上的总距离和死节点数是两者都较小。

p.s。:如果您遇到这种方法,请到目前为止发布代码O:)