您的位置:首页 > 其它

floyd算法的理解

2015-08-21 20:15 239 查看
<span style="font-family:Microsoft YaHei;font-size:18px;">floyd算法适用于APSP(all pairs shortestpaths,多源最短路径),是一种动态规划方法

对于稠密图(点的密集度高),执行效率要高于dijkstra和spfa算法,这种方法是用二维数

组来存储点与点之间的距离,所以不适合有大量的点,就像点i到点j之间的距离就存储

在map[i][j]里

接下来讲讲三重循环:

for(k=0;k<n;k++)

for(i=0;i<n;i++)

for(j=0;j<n;j++)

先来解释第一个循环,k的作用是当做中间点,比如i=7,j=5,k=6

那么就会有这种情况对i与j之间的距离进行更新,即为min(i=7 -> j=5,i=7-> k=6 + k=6 -> j=5);

而且我们会发现spfa当中的负环判断在这个循环当中也是有体现的,我们知道负环判断条件是一个点进入队列的

次数是否大于点的个数, 即 if(used[]>n)  printf("存在负环\n"); (这个算法判断不了负环,我只是连接一下知识,因为每个点循环n次,并不会出现死循环)

那么此处体现在这里:当k=0,i=0时,我们就会把j=0循环到j=n-1,此时k=0这个点相当于进入队列一次,接着更新

与k=0这个点相连接的点的值,即map[][], 然后i=1...到i=n-1,那么 总共算起来,k=0这个点就循环了n次了,所我觉得floyd算法

还是不错的,不过就是每个点都循环了n次,这个就降低效率了,不过这也保证了所有点之间的距离都会更新到最小值

今天就弄到这里,以后再回过头来理解一遍,说不定到时候会与跟多的知识连接起来 </span>
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签: