<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>
floyd算法的理解
最新推荐文章于 2021-07-11 00:44:32 发布