您的位置:首页 > 其它

Floyd算法(弗洛伊德算法) 百度百科

2016-03-09 21:15 211 查看


核心代码

for(int k=1; k<=NODE; ++k)//对于每一个中转点
for(int i=0; i<=NODE; ++i)//枚举源点
for(int j=0; j<=NODE; ++j)//枚举终点
if(distmap[i][j]>distmap[i][k]+distmap[k][j])//不满足三角不等式
{
distmap[i][j]=distmap[i][k]+distmap[k][j];//更新
path[i][j]=k;//记录路径
}



状态转移方程

状态转移方程如下: map[i,j]:=min{map[i,k]+map[k,j],map[i,j]};

map[i,j]表示i到j的最短距离,K是穷举i,j的断点,map[n,n]初值应该为0,或者按照题目意思来做。

当然,如果这条路没有通的话,还必须特殊处理,比如没有map[i,k]这条路。


时间复杂度与空间复杂度

编辑

时间复杂度:O(n^3);

空间复杂度:O(n^2)[1]


优缺点分析

编辑

Floyd算法适用于APSP(All Pairs Shortest Paths,多源最短路径),是一种动态规划算法,稠密图效果最佳,边权可正可负。此算法简单有效,由于三重循环结构紧凑,对于稠密图,效率要高于执行|V|次Dijkstra算法,也要高于执行V次SPFA算法

优点:容易理解,可以算出任意两个节点之间的最短距离,代码编写简单。

缺点:时间复杂度比较高,不适合计算大量数据。


算法描述

编辑

a) 初始化:D[u,v]=A[u,v]

b) For k:=1 to n

For i:=1 to n

For j:=1 to n

If D[i,j]>D[i,k]+D[k,j] Then

D[i,j]:=D[i,k]+D[k,j];

c) 算法结束:D即为所有点对的最短路径矩阵


参考代码

编辑


C语言


C++语言

内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签: