也请参阅附件!
假设:
在图V中存在1> n个节点和m个边。V可以是有向的或无向的。
2>所有边的权重是非负有限数。
Dijkstra算法的作用:
------------------------
它找到从特定节点到所有其他顶点的所有最短路径。
Dijkstra算法如何做到这一点:
----------------------------
在算法运行的任何时间点,我们都有2组节点。
集1的节点的最短路径已被发现。
集2具有最短路径尚未发现的节点。
同样,节点S的最短路径为0。
因此最初,集合1仅具有一个单个节点S.S距离S的路径最短,而S的距离为0。
我们称0为S的Dijkstra得分,并将其表示为D(S)。 我们将其存储在某个地方。
现在,我们检查从集合1到集合2的所有边。我们将D(S)分别添加到所有这些边
并比较结果。 结果为D(V)最小的节点V包含在Set 1中并排除在外
从组2中存储D(V)。
同样,在下一步中,将单独检查连接集合2的节点的S或V的所有边。
现在我们有2个Dijkstra分数D(S)和D(V)。 因此对于具有一个终点为S的边缘
将被添加到D(S),其他将被添加到D(V)。 找到最小结果D(U),其中节点为U。
U被包含在集合1中。U被排除在集合2中。存储D(U)。
这样,算法即可工作。 由于Set 2为空,它将停止。
节点的所有Dijkstra分数都是最短路径。
正确性:
------------
我们假设当第(K + 1)个节点添加到集合1中时,
Dijstra算法首次失败。 那意味着
第(K + 1)个节点是从S到最短路径有错误的第一个节点。
我们称节点K + 1的Dijkstra分数为D(K + 1)。
因此,直到第K个节点,所有dijkstra分数才真正成为最短路径。
我们假设从S出发的实际最短路径不是D(K + 1)。 ----假设1
因此,存在一条更短的替代路径。 这意味着该替代方案中的任何节点
路径到S的距离比值D(K + 1)小。 ----假设2
同样,这条最短的替代路径是从Set 1到Set 2的某个地方。
假设此交叉边缘连接节点J。显然,直到从S到该替代路径中的J为止,所有节点的Dijkstra得分均为距S的最短距离。
这是矛盾。 根据假设2,D(J)始终小于D(K + 1)。
因此,在集合1中包含第K个节点后,就永远不能包含第K + 1个节点
因为D(J)小于D(K + 1),所以在节点J之前进入集合1。
因此,假设1是错误的。
From: https://bytes.com/topic/algorithms/insights/951294-correctness-dijkstras-algorithm