前言:
昨天因为某位**,想要喷我那篇思路和别人抄的证明博客。。。
然后,就果断删除啥也没保存,今天又来重写。
自己推的
引子:
我们应该知道一些东西, D i j k s t r a Dijkstra Dijkstra的路径应该是他的已经确定的最短路,到源点的距离。
然后捏~ D i j k s t r a Dijkstra Dijkstra的大概思想就是从一开始将起点到起点的距离记为 0 0 0,然后进行 n n n次循环,然后我们会找到一个到起点距离 d i s t dist dist最短的点 x x x。
但是为什么循环找到的 x x x,必定就是 d i s t dist dist到源点的最短路呢?
证明啊!
证明:
再次声明,没有转载!
我们设前面 n n n个已经确定为最短路 d i s t dist dist是正确的即是前 n n n个点已经是红点,
那么要证明 n + 1 n + 1 n+1个蓝点 x x x会变为红点,即证明剩下的点中连最小的蓝点的距离 d i s t dist dist也是正确的。
简单来说,就是证明这条从源点出发的,并且经过之前 n n n个红点的那条路径,也就是之后蓝点的路径 x x x的最短路。
那么假设 n + 1 的那个点的距离并不是正确的,那就是说最短路不是path应该有以下的两种情况:
- x x x的最短路是另外一条路 path_。path_ 这条最短路,除了 x x x其他都是红色阵营集合里面的,那么接着设path_所经过的最后一个红点是L。
在蓝点阵营中找一个相邻顶点k,使得与L的dist距离最小。
当 k ! = L 时 当 k != L 时 当k!=L时,对于前面我们假设 n + 1 n + 1 n+1的那个点的 p a t h path path并不是正确的假设,可以得知:
distL + dist(L , x) < distk + dist(k,x)
当 k = L 时 当 k = L 时 当k=L时,根据前 n n n个点都会对的假设的话,又会得出来一个东西:
len(path) <= len (L)
如果想要有更短的路径,只能经过红色阵营外面的点。那么设真正的源点到 x x x的最短路为 p a t h ‘ path‘ path‘。
则 p a t h ’ path’ path’经过的第一个集合外面的点 k k k,
当 k ! = x 时 : 当 k != x 时: 当k!=x时:
根据前 n n n个点都是正确的最短路的假设,所以 k k k的最短路一定是diskk。
我们知道
D
i
j
k
s
t
r
a
Dijkstra
Dijkstra和无负权边的尿性特点,我们知道
lenpath’ = distk + disk(k , x)
lenpath’ > diskk > diskx
所以 p a t h ′ path' path′根本不可能是最短路,所以矛盾。