对于强森算法的算法思想,如果给定的图中是没有负数的边,那么就可以使用迪杰斯特拉算法来进行遍历每个节点,找到它与其他节点的最短路径,而如果给定的图中是存在负数的边,但是不存在负数的环的时候,那么就可以使用算法对边长做一些修改并且可以准确的找到给定的两个节点之间的最短路径。
而对边长进行修改的时候,要注意两点,第一点是在修改之前,如果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 字(可选)
经过如此的修改之后,给定的图中的所有边都变成了正数的边。