在有向图中,找到从s到t的最短路径,使路径通过V的某个子集,让我们称之为死亡节点。算法给出一个数n,当从s到t遍历时,该路径不能超过n个死亡节点。她找到最短路径的最佳方法是什么?我正在削弱Dijkstra,但是如何确保我们不会超过n个节点?请帮我调整Dijkstra's以包含这个条件。
答案 0 :(得分:1)
如果n很小,你可以复制你的图形,称它们为1到n级。
从级别1的s开始。如果您处于正常节点,则边缘会将您带到同一级别的节点。如果您处于死亡节点,则边缘会将您带到下一级别的节点。如果你在n级的死亡节点,则边缘被省略。
还将所有级别的t节点连接到新的单个目标T(零权重)。
然后计算从s到T的最短路径。
这种方法的问题是图形大小上升了n倍,所以它只适用于小n。
另一种方法是增加每个边缘的权重,使变量x留下死亡节点。
当您增加变量x时,最短路径将使用越来越少的死亡节点。调整x的值(例如,使用二分法),直到图形仅使用n个死亡节点。
这应该采用最短路径的O(logn)评估。
答案 1 :(得分:0)
我将路上遇到的死节点数作为计算距离的新(稀疏)维度添加 - 基本上每个节点最多有n个最佳距离。
实现你自己的BFS将是类似的:你需要对每个节点处理“看到x死节点”不同于“看到y死节点”,除非路上的总距离和死节点数是两者都较小。
p.s。:如果您遇到这种方法,请到目前为止发布代码O:)