Dijkstras算法根据起始节点和中间节点之间的边缘权重假设最近邻居。重复此过程,直到到达目标节点。
如果起始节点和中间节点之间的最短路径是通过其他几个中间节点的间接路由,该怎么办?
答案 0 :(得分:2)
如果起始节点和中间节点之间的最短路径怎么办? 是通过其他几个中间节点的间接路由?
在尝试查找最短路径时,通常需要遍历多个节点。如果没有多条可能的路径,那你为什么需要Dijkstra?
想象一下下面的图表:
为了更好地理解,我们可以说算法从顺时针方向开始,从START
开始到1
节点。它会发现START -> 1 -> 6 -> END
成本为7.然后它会逆时针走,发现START -> 3 -> 5 -> 8 -> 9 -> END
成本为5.算法会将逆时针路径标记为从START
获取的最短路径到END
。
现在让我们说我们有以下图表:
算法会发现START -> 1 -> 9
成本为5(顺时针),而START -> 3 -> 5 -> 8 -> 9
成本为4(逆时针)。因此算法会将逆时针路径标记为从START
到END
的最短路径,其成本为5.接下来,算法将尝试找到另一个(如果可能的话更短)路径{{1 }}。它会发现此路径的费用为4,并且会将此路径标记为从START -> 1 -> 6 -> END
到START
的最短路径。
答案 1 :(得分:1)
使用括号中每条边的成本的简单图表:
_____ (5)
/ \
Root Dest
\__A__/
(2) (1)
然后Dijkstra's algorithm using a min-priority queue将:
queue = [(root-A : 2), (root-dest : 5)]
A
,因此达到A
的最低费用为2
(如果任何后续的,成本较高的路径达到{{1}然后可以忽略它们。)A
queue = [(root-A-dest : 3), (root-dest : 5)]
,因此达到dest
的最低费用为dest
。因此,对于最小优先级队列,如果通过间接顶点的路径与直接路径相比较短,则直接边缘可以在队列中保持未处理状态。
如果2个图节点之间的间接路径比直接路径短,Dijkstras算法能否检测到它?
是的,上面的例子表明它会。
答案 2 :(得分:0)
我认为您不太了解该算法的工作原理。是的,它首先检查最近的邻居 - 但它仍然检查所有其他邻居,它不会丢弃它们只是因为它们不是最近的。如果最短路径真正通过间接路径,则沿着该路径的每个节点必须具有比较长的直接路径更短的总距离,并且因此之前被访问。为了确保这一点,需要在算法输入中禁止负权重。