Dijkstra算法

1.图为G,起点为x,目标是找到x到G中各点的最短路径。
2.已经找到最短路径的点的集合为S,未确定最短路径点的集合为P,S和P的合集为G。
3.y为P中某点,且y是下一个离x最近的点,x到y的路径必然是经过S中的点直接到y的,即y是从S直达的。
反证法证明:假设x到y的路径途径P中某点z,则路径D(x,y) = D(x,z)+D(z,y)>D(x,z),那样z的路径比y还短,这显然跟y是下一个最近点矛盾。
4.Q为从S能直达的点的集合。由于之前证明得出y是从S直达的,那么y是属于Q的。
5.S初始为只包含x,显而易见在G中的各点中,x到自己的路径是最短的,这是种极端情况。
此时我们找出S集合能直达的点,即x能直达的点,找到所有以x为起点的边,各边的终点的集合即为Q。
对于所有Q中的点v,计算D(x,v),即为从S能直达v的最短路径。
当中最短的一条边E(x,u)即为从x直达的最短路径,即从S直达的最短路径。
6.u即为下一个离x最近的点,u移除出P和Q,把u加入到S中。
此时由于S中新加入了点u,S能直达的点可能会变多,Q需要合并从u能直达的点。
假设u能到达点v,v有两种可能情况,即v已经在Q中或不在Q中。
如果v已经在Q中,D(x,v)为在u加入之前从S能到达v的最短路径。
如果在S加入点u之后D(x,u)+D(u,v)<D(x,v),则从S能直达v的最短路径D(x,v)更新为D(x,u)+D(u,v)。
如果v不在Q中,即之前S不能直达点v,由于u点加入S,使得S可以直达v,当前S能直达v的唯一且最短路径就是D(x,u)+D(u,v),
将v加入Q。此时Q为当前S能直达的点的集合,同时Q中的点v都有从S直达的最短路径D(x,v)。
找到当前Q中从S直达的最短路径D(x,u),u即为下一个离x最近的点。
重复步骤6,得到递增的最短路径序列。
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值