不妨设dij后得到的最短路径 <S,V> 集合初始时S为空集,V为每个顶点组成的集合;
初始时,S为空集,确定源点后加入源点a,此时V中元素仍为V。(大部分证明都把V认为是所有源点的集合减去已经确定最短路的集合,此处使用另一种形式证明)
加入a后能得到一条最短路,此处将a到a的距离认为是0,则此时能够得到一条最短路即a到a自身;
a加入S后,把a经过一条以a为起点的边对应到每个源点的权值更新,若a与某源点没有边则记为NO;选择其中权值最小且未被选取过的顶点b;按照dij的思想,(a,b)的权值即dis[a][b]即为a到b的最短路,记为ans[b];此处严格证明这一观点,这也是dij的核心;
存在某一点c,使得dis[a][c]+dis[c][b]<ans[b],分两种情况讨论:若c已经在集合S中且未被选取过,由于dis[c][b]非负,立即求得dis[a][c]即ans[c]<ans[b],这与每次选取ans中未被选取过且权值最小的点不符,立即推得矛盾;
若c是已经被选取过的点,则当选取c时就已经更新了ans[b],那么就成了伪命题;
除此之外的疑问是c未被选取过但就是能确定从c作为起点到达b能得到最短路,那么想得到最终正确的ans[b],必须把c加入后再重新更新ans[b],这种问题的判定稍微复杂;
此处我把a到c的权值分为2种情况;1是在选取b节点时已经得到了ans[c]不为NO,2是未确定ans[c]即ans[c]==NO;
对1