floyd算法的理解

<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>

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值