NOTE - dijstra算法的正确性非常依赖于边权值的非负。
原因是: 设V为所有点集, S为确定最短路径的点集,算法每次取V-S中与源点距离最小的点来松弛其他边,并将该点其加入S中.
反证法 + 归纳法
初始时,只有一个源点位于S中,加入S的为与源点直接距离最短的点k,并以k来松弛其他边。假设k'为松弛后与源点距离最小的点,则k'此时可以加入S,即此时k'与源点的距离为最短路径的长度,设其为d'。
假设d'非最短路径长度,即存在一个更短的路径.
思考d'如何得来的,其是通过源点 --- k --- k'
得到。已知与源点直接相邻的点中k为最近点,并且边的权值为非负,因此不存在通过其他直接相邻的点t的更短路径.
以上思路可以写成更严格的归纳法.