
简介
罗伯特•弗洛伊德(Robert W.Floyd)计算机科学家,图灵奖得主,前后断言法的创始人,堆排序算法和Floyd-Warshall算法的创始人之一。第一次把“不确定性”概念引入程序,并且在分析理论、程序设计语言的逻辑与语义、自动程序验证、自动程序综合、算法分析以及编译器方面做出了巨大贡献,被授予第十三届图灵奖。
Floyd-Warshall算法,中文亦称弗洛伊德算法,是解决任意两点间的最短路径的一种算法,可以正确处理有向图或负权的最短路径问题,同时也被用于计算有向图的传递闭包。
算法流程
弗洛伊德算法的原理是动态规划。假设图G中顶点个数为N,则需要对矩阵S进行N次更新。
- 初始时,矩阵S中顶点a[i][j]的距离为顶点i到顶点j的权值;如果i和j不相邻,则a[i][j]=∞。
- 接下来开始,对矩阵S进行N次更新。第1次更新时,如果”a[i][j]的距离” > “a[i][0]+a[0][j]”(a[i][0]+a[0][j]表示”i与j之间经过第1个顶点的距离”),则更新a[i][j]为”a[i][0]+a[0][j]”。
- 同理,第k次更新时,如果”a[i][j]的距离” > “a[i][k]+a[k][j]”,则更新a[i][j]为”a[i][k]+a[k][j]”。
- 更新N次之后,操作完成!
算法实现(Java)
/**
* @description 最短路径之弗洛伊德(Floyd)算法(即求网图G中各顶点i到其余顶点j的最短路径prev[i][j]及带权长度dist[i][j])
* 输入 --> G:无向有权图
* 输出 --> 最短距离数组及长度
* @author GongchuangSu
* @since 2016.04.18
* @version v1.0
*/
public class Floyd {
WeightedGraph G;
int vlen;