我知道dijkstra的算法是什么。而且我知道它在用于查找从A到所有其他可能节点的所有路径时是最佳的。但是,如果你试图找到从A到B的路径,它是否是最佳的?换句话说,它应该在搜索从A到B的路径时使用,还是有其他更好的算法用于此用例。
编辑:如果我在找到目标节点后完全打破了循环,我认为它不起作用。假设我有这个图https://i.stack.imgur.com/orp0N.png,我试图从A到D.由于这个算法是贪婪的,它将首先进入A-> B,B-> F(死胡同),B-> ; E,E-> D,总重量为9.虽然路径较短。最终会在这条路径之后找到。
答案 0 :(得分:1)
您无需从A找到所有节点的距离。只需在将B放入最短路径树后退出循环。
从性能的角度来看,没有更好的算法。在最坏的情况下,从特定节点发现最短路径的所有算法都以O(n ^ 2)运行。
EDIT。但是,如果我们考虑到已处理图形的某些特定特征(例如顶点数和边数的比率),则可以获得稍好的性能
EDIT2。关于您的示例图表。以下是步骤:
1. A被添加到最短路径树(SPT)
2.更新不在SPT中的邻居。 DIST(B)= 3
3.使用min.dist选择顶点。不是在SPT。这是B.将B添加到SPT
4.更新不在SPT中的邻居。 dist(C)= 6,dist(E)= 5,dist(F)= 4
5.使用min.dist选择顶点。不是在SPT。这是F.将F添加到SPT
6. F没有邻居
7.使用min.dist选择顶点。不是在SPT。这是E.将E添加到SPT
8.更新不在SPT中的邻居。 DIST(d)= 9
9.使用min.dist选择顶点。不是在SPT。这是C.将C添加到SPT
10.更新不在SPT中的邻居。 DIST(d)= 7。
11.使用min.dist选择顶点。不是在SPT。这是D.将D添加到SPT
完成