Dijkstra算法是否必须始终在两个顶点之间找到最短的部分?
答案 0 :(得分:1)
是的,确实如此。已经是proven:
Dijkstra算法的证明是通过对 访问的节点数。
不变假设:对于每个访问的节点 v ,均会考虑 dist [v] 从源到 v 的最短距离;对于每个未访问的节点 u , 通过访问者旅行时, dist [u] 被认为是最短的距离 仅限节点,从源到 u 。仅在以下情况下考虑此假设: 路径存在,否则距离设置为无穷大。 (注意:我们会 不假设 dist [u] 是未访问者的实际最短距离 节点)
基本情况是只有一个访问的节点,即 初始节点来源,在这种情况下,假设是微不足道的。否则,假设关于 n-1 个访问节点的假设。在这种情况下, 我们选择边缘 vu ,其中 u 的 dist [u] 最小 节点和边缘 vu 使得 dist [u] = dist [v] +长度[v,u] 。 dist [u] 被认为是从源到 u 的最短距离 因为如果路径更短,并且 w 是第一个未访问的人 然后按照原始假设 dist [w]> dist [u] 这就产生了矛盾。同样,如果路径更短 到 u 而不使用未访问的节点,并且如果最后一个节点是一个节点 该路径为 w ,那么我们本来会有 dist [u] = dist [w] + 长度[w,u] ,这也是一个矛盾。
处理 u 后,它仍然 确实,对于每个未访问的节点 w , dist [w] 将是最短的 仅使用访问的节点从源到 w 的距离,因为如果存在 是一个较短的路径, u 不会,我们会发现的 以前,如果使用 u 的路径更短, 在处理 u 时对其进行了更新。
答案 1 :(得分:0)
如果图形中所有边缘权重均为正,则Dijkstra的算法会找到最短路径。但是,如果图形的负权重不起作用。为了在具有负边缘权重的图形中找到最短路径,使用了Bellman-Ford之类的算法。