dijkstra算法证明

假设s为起点

设我们找到的从s到v的距离为d\left ( v \right )

设s到v的实际最短距离为\delta \left(v \right )

l\left(Q \right )为路径Q的距离

设找到的点为集合S

我们要证明 \forall x \in S,d\left(x \right ) = \delta \left(x \right )

使用数学归纳法

证明:

S=\left \{ s \right \}时,d\left( s \right )= 0 = \delta \left( s \right ) ,成立

假设迭代了k轮之后依然成立

设我们在第k轮时算法找到了u

令 S^{'} = S\bigcup \left \{ u \right \}

由假设,\forall x \in S^{'} ,x \neq u , d\left(x \right ) = \delta \left( x \right )

现在要证明d\left(u \right ) = \delta \left( u \right )

使用反证法

假设s到u真正的最短路径为Q

l \left(Q \right ) < d\left(u \right ) 

我们知道,Q一定不会在这一轮结束(因为结束了这轮就不会选择u),

但是Q路径上有一部分是在S^{'}中的

假设xy是一条边,x \in S^{'},y \notin S^{'},x \neq u

Q_{x}为顶点x结束时Q的子路径,

有 l\left(Q_{x} \right )+ l\left(xy \right ) \leq l\left(Q \right )

由于这一轮选的是u而不是x,说明之前就选过x,因为xy是一条边,所以y一定是被更新过的

d\left(y \right ) \leq d\left(x \right ) + l\left(xy \right ) (s到y的最短路径一定<=其他从s到y的路径)

\therefore d\left(y \right ) \leq l\left( Q_{x} \right )+ l\left(xy \right ) \leq l\left(Q \right )

\because y \notin S^{'}

\therefore d\left(u \right ) \leq d\left(y \right ) (因为每次选择最小的尚未被访问过的迭代)

 又因为假设了 l \left(Q \right ) < d\left(u \right )

l\left(Q \right ) < d\left(u \right ) \leq d\left(y \right ) \leq l\left(Q \right )

l\left(Q \right ) < l\left(Q \right )

矛盾

\therefore d\left(u \right ) = \delta \left(u \right )

 

 

 

你可能感兴趣的:(数据结构与算法)