Dijkstra算法

这是转的

Dijkstra算法

想法(部分转)

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在弹出之前就已经被修改好多次了,直到无法修改(完美无瑕)时才会被弹出

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值