对Floyd算法的理解
Floyd算法又称为插点法,是一种利用动态规划的思想寻找给定的加权图中多源点之间最短路径的算法,与Dijkstra算法类似。该算法名称以创始人之一、1978年图灵奖获得者、斯坦福大学计算机科学系教授罗伯特·弗洛伊德命名。
特点
1、Floyd是使用动态规划思想解决多源最短路径的经典算法(即图中任意两点的最短路径)。
2、可以处理负权边。
3、不能处理负权环。(Dijstra算法既不能处理负权边也不能处理负权环)
4、可以处理无向图和有向图
算法基本策略
从任意节点u到任意节点v的最短路径有2种:
1、是直接从u到v
2、是从u经过若干个节点k到v
所以,我们假设graph(u,v)为节点u到节点v的最短路径的距离(当然,不同的题目代表的不一样,比如有的可能是花费,需要灵活变通),对于每一个节点k(1~N个节点),我们检查graph(u,k) + graph(k,v) < graph(u,v)是否成立,如果成立,证明从u到k再到v的路径比u直接到v的路径短,我们便设置graph(u,v) = graph(u,k) + graph(k,v),当我们遍历完所有节点k,graph(u,v)中记录的便是u到v的最短路径的距离。
代码实现(个人尝试版)
主要使用两张表,路由表(数组)Node和距离表(数组)Path,使用上述算法策略对表内存储信息进行更新,得出最终任意两点的最短路径值与最短路径序列。
图1 算法测试Graph
public class Floyd {
public void floyd(){
int inf = Integer.MAX_VALUE;
//定义起始Path数组
int Path[][] = {
{
inf,5,inf,7},
{
inf,inf,4,2},
{
3,