使用强森算法求任意两点之间最短路径

对于强森算法的算法思想,如果给定的图中是没有负数的边,那么就可以使用迪杰斯特拉算法来进行遍历每个节点,找到它与其他节点的最短路径,而如果给定的图中是存在负数的边,但是不存在负数的环的时候,那么就可以使用算法对边长做一些修改并且可以准确的找到给定的两个节点之间的最短路径。

而对边长进行修改的时候,要注意两点,第一点是在修改之前,如果p是节点u,v之间的最短路径,那么在修改之后要必须保证p依然是节点u,v之间的最短路径,第二点就是要确保修改之后是不存在负数的边的。

针对以上两点,假设有一个函数T,它能给每个节点赋值,也就是吧节点vi作为参数传入函数T中,就可以得到一个数值T(vi),如果用E(u,v)来表示图中每一条边(u,v)的长度,那么就可以修改为:

添加图片注释,不超过 140 字(可选)

在这样的修改之后,最短路径是不会发生变化的,而且假设P:{v0...vn}是起始节点v0抵达终节点vn的一条路径,当边长单招上面的公式进行修改之后,路径p的长度就变成:

添加图片注释,不超过 140 字(可选)

也就是说,边长修改之后,路径的长度是会发生变化的,但路径的相对大小是不变的,原来是最短路径,修改之后仍然是最短路径,只不过路径的长度发生了变化,依照这个性质,只要对函数T进行设计,就能够将给定的图中的负数边变成正数。

对于给定的任意的一个图,增加一个新节点s,然后对原来的图中每个节点v,增加新的边(s,v),并且把这些边的长度都设置为0之后,由于对任何节点v,都会存在一条边(s,v)使得从s都可以抵达v,因此从s到任意节点v的最短路径都是一定存在的。

于是对于任何的边(u,v)都可以查找从s到两点之间的最短路径,可以把函数T设置成从s到对应节点的最短路径,也就是:

添加图片注释,不超过 140 字(可选)

然后就有:

添加图片注释,不超过 140 字(可选)

经过如此的修改之后,给定的图中的所有边都变成了正数的边。

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值