最短路径算法
最短路径问 题。即寻找图中某两个特定结点间最短的路径长度。所谓图上的路径,即从图中 一个起始结点到一个终止结点途中经过的所有结点序列,路径的长度即所经过的边权和。
Floyd算法
Floyd算法又被称为佛洛依德算法,其算法思路如下:
用邻接矩阵保存原图,那么此时邻接矩阵中 edge[i][j]
的值即表示从结点 i 到 结点j,中间不经过任何结点时距离的最小值(若它们之间有多条边,取最小权值保存至邻接矩阵;也可能为无穷,即不可达)。
假设结点编号为 1 到 N,考虑从结点i 到结点j 中间只能经过编号小于等于1的结点(也可以不经过)时最短路径长度。与原始状况相比,在中间路径上可以经过的结点增加了编号为1 的结点。又知最短路径上的结点一定不会出现重复(不考虑存在负权值的情况)。那么,某两个结点间若由于允许经过结点 1 而出现了新的最短路径, 则该路径被结点 1 分割成两部分:由 i 到结点 1,同时中间路径上不经过结点 1 的第一段路径;由结点 1 到 j,中间路径上同样不经过结点 1 的第二段路径,其 路径总长度为edge[i][1] + edge[1][j]
。
要确定该路径是否比不允许经过结点1时更短,比较edge[i][1] + edge[1][j]
与edge[i][j]
之间的大小关系。若前者较小, 则说明中间路径经过结点1时比原来更短,则用该值代表由i 到j 中间路径结点编号小于等于1的最短路径长度;否则,该路径长度将依然保持原值edge[i][j]
, 即虽然允许经过结点1,但是不经过时路径长度最短。
考虑更一般的情况,若edge[i][j]
表示从结点i到结点j,中间只能