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>
相关文章推荐
- light oj 1317
- 深入理解JavaScript系列(29):设计模式之装饰者模式
- cv::imdecode 效率问题
- 输出单向链表中倒数第k个结点
- 洛谷1068 分数线划定 解题报告
- [转] valuestack,stackContext,ActionContext.之间的关系
- GDOI 8.21模拟
- 继续畅通工程(2008浙江大学研究生复试上机题[最小生成树] hdoj 1879 )
- Makefile中的ifeq 多条件使用
- SDKD Summer Team Contest R
- http://blog.163.com/gobby_1110/blog/static/29281715201352004329356/
- PMBOK项目管理认知概要
- HDU:1465不容易系列之一 解题心得
- PHP相关图书推荐
- [杂谈]机器学习:数学、概率与人工智能
- 深入理解JavaScript系列(27):设计模式之建造者模式
- Convert QWERTY to Dvorak ZOJ 3878
- 原因好消息: 自己主动算法设计推箱子游戏(三)
- Centos5.5 安装memcache
- servlet清晰理解