这是转的
想法(部分转)
a.初始时,S只包含源点,即S={v},v的距离为0。U包含除v外的其他顶磅点,即:U={其余顶点},若v与U中顶点u有边,则(u,v)正常有权值,若u不是v的出边邻接点,则(u,v)权值为∞。
b.从U中选取一个距离v最小的顶点k,把k,加入S中(该选定的距离就是v到k的最短路径长度)。
c.以k为新考虑的中间点,修改U中各顶点的距离;若从源点v到顶点u的距离(经过顶点k)比原来距离(不经过顶点k)短,则修改顶点u的距离值,修改后的距离值的顶点k的距离加上边上的权。
d.重复步骤b和c直到所有顶点都包含在S中。
为什么b到原点a是所有距离中的最短后就加入S里 ?????
在现在这个状态时,除了inf(到原点距离为inf 看上一段a)的点,其他点都能从原点直接或间接(间接走到也一定通过不是inf的点)走到(inf的点都必须通过not inf 的点为转点走到)
也就是说想要从原点a到达b并且不走当前最短路,一定会经过一条比当前最短路更长的路
有可能 b到原点a不是所有距离中的最短但他确实是最短路啊????
假如a到p比a到b距离短,那么有两种情况,
1.a到p+p到b < a到b.
2.a到p+p到b>=a到b.
如果是第一种情况,p被弹出时会修改与p相连的点的dis值,就可能修改dis[b]
也就是说,b在弹出之前就已经被修改好多次了,直到无法修改(完美无瑕)时才会被弹出
17万+

被折叠的 条评论
为什么被折叠?



