Chinaunix首页 | 论坛 | 博客
  • 博客访问: 453650
  • 博文数量: 122
  • 博客积分: 5000
  • 博客等级: 大校
  • 技术积分: 1540
  • 用 户 组: 普通用户
  • 注册时间: 2008-11-26 11:11
文章分类

全部博文(122)

文章存档

2010年(1)

2009年(76)

2008年(45)

我的朋友

分类:

2009-08-06 16:38:48

弗洛伊德(Floyd)算法


Floyd-Warshall算法(Floyd-Warshall algorithm)是解决任意两点间的的一种,可以正确处理或负权的最短路径问题。

Floyd-Warshall算法的为O(N3),为O(N2)

原理

Floyd-Warshall算法的原理是。

Di,j,k为从ij的只以(1..k)集合中的节点为中间结点的最短路径的长度。

  1. 若最短路径经过点k,则Di,j,k = Di,k,k − 1 + Dk,j,k − 1
  2. 若最短路径不经过点k,则Di,j,k = Di,j,k − 1

因此,Di,j,k = min(Di,k,k − 1 + Dk,j,k − 1,Di,j,k − 1)


在实际算法中,为了节约空间,可以直接在原来空间上进行迭代,这样空间可降至二维。(见下面的算法描述)

算法描述

Floyd-Warshall算法的描述如下:

for k  1 to n do
for i 1 to n do
for j 1 to n do
if (Di,k + Dk,j < Di,j) then
Di,j Di,k + Dk,j;

其中Di,j表示由点i到点j的代价,当Di,j为 ∞ 表示两点之间没有任何连接。


弗洛伊德(Floyd)算法过程:
1、用D[v][w]记录每一对顶点的最短距离。
2、依次扫描每一个点,并以其为基点再遍历所有每一对顶点D[][]的值,看看是否可用过该基点让这对顶点间的距离更小。
算法理解:
最短距离有三种情况:
1、两点的直达距离最短。(如下图
2、两点间只通过一个中间点而距离最短。(图
3、两点间用通过两各以上的顶点而距离最短。(图

对于第一种情况:在初始化的时候就已经找出来了且以后也不会更改到。
对于第二种情况:弗洛伊德算法的基本操作就是对于每一对顶点,遍历所有其它顶点,看看可否通过这一个顶点让这对顶点距离更短,也就是遍历了图中所有的三角形(算法中对同一个三角形扫描了九次,原则上只用扫描三次即可,但要加入判断,效率更低)。
对 于第三种情况:如下图的五边形,可先找一点(比如x,使=2),就变成了四边形问题,再找一点(比如y,使


原文参考:




阅读(1443) | 评论(0) | 转发(0) |
给主人留下些什么吧!~~