Warning: file_get_contents(/data/phpspider/zhask/data//catemap/6/mongodb/11.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_Dijkstra - Fatal编程技术网

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

Algorithm 通过某些已定义节点的最短路径,algorithm,dijkstra,Algorithm,Dijkstra,在一个有向图中,找到从s到t的最短路径,使路径通过V的某个子集,我们称之为死亡节点。该算法给定一个数字n,当从s到t遍历时,路径不能通过n个以上的死亡节点。她说,找到最短路径的最好方法是什么?我正在偷Dijkstra的,但是如何确保我们通过的节点不超过n个?请帮我调整Dijkstra's以包含此条件。Small n 如果n很小,您可以制作n个图形副本,将它们称为级别1到n 你从1级的s开始。如果位于法线节点,则边会将您带到同一标高内的节点。如果处于死亡节点,则边将带您到下一级别内的节点。如果您位

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

Small n 如果n很小,您可以制作n个图形副本,将它们称为级别1到n

你从1级的s开始。如果位于法线节点,则边会将您带到同一标高内的节点。如果处于死亡节点,则边将带您到下一级别内的节点。如果您位于标高n上的死亡节点,则只需忽略边

还将所有级别的t节点连接到新的单一目的地t(重量为零)

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

这种方法的问题是图的大小增加了n倍,因此它只适用于小的n

大的 另一种方法是将离开死亡节点的每条边的权重增加一个变量x

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


这应该需要对最短路径进行O(logn)左右的评估。

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

实现您自己的BFS将是类似的:对于每个节点,您需要将“使用x个死节点查看”与“使用y个死节点查看”区别对待,除非途中的总距离和死节点数都较小

p.s.:如果您被这一方法所困扰,请发布到目前为止的代码O:)