博客
关于我
强烈建议你试试无所不能的chatGPT,快点击我
弗洛伊德(Floyd)算法入门
阅读量:3898 次
发布时间:2019-05-23

本文共 789 字,大约阅读时间需要 2 分钟。

这个算法其实是在基于动态规划算法之上(类似于01背包)进行设想的

部分代码和思路参考自

设Di,j,k为从i到j的只以(1…k)集合中结点为中间结点的最短路径的长度,那么按照01背包的思维就是1.从顶点I到顶点J是不经过K的,那么就是Dijk-1,2.如果确实经过k的话,就把两个顶点拆分成两个部分Dikk-1+Djkk-1

然后使用三次循环,来求对应的值。
最后可以将三维的数组变成二维的数组

三维数组形式:

void floyd(){
for(int i=1;i<=n;i++) for(int j=1;j<=n;j++) dis[i][j][0]=map[i][j]; for(int k=1;k<=n;k++) for(int i=1;i<=n;i++) for(int j=1;j<=n;j++) {
dis[i][j][k]=dis[i][j][k-1]; if(dis[i][j][k]>dis[i][k][k-1]+dis[k][j][k-1]) dis[i][j][k]=dis[i][k][k-1]+dis[k][j][k-1]; }}

二维数组形式:

for(int k =1 ;  k <= n ; k ++ ){
for(int i =1 ; i<= n ; i++){
for(int j =1 ;j<=n;j++){
dist[ i ][ j ]= min( dist[ i ][ j ],dist[ i ][ k ]+dist[ k ][ j ] ); } } }

总结下来,弗洛伊德算法比较适合多个起点和多个终点,而迪杰特斯拉算法更加适合唯一的起点和终点。

转载地址:http://skfen.baihongyu.com/

你可能感兴趣的文章
在 2016 年做 PHP 开发是一种什么样的体验?(一)
查看>>
PHP获取客户端的IP
查看>>
从头开始学习yii2---1.搭建yii2开发环境
查看>>
从头开始学习yii2---3.语言包的配置
查看>>
yii2-表单验证的一些规则
查看>>
索引相关问题
查看>>
php面试可能会被问道的技术题汇总
查看>>
php面试题1-线程和进程的区别(顺带提下协程)
查看>>
php面试题2-用到过的传输协议
查看>>
php面试题3-yii2和yii的不一样的地方
查看>>
IOS 一些好的框架和 技术大牛的博客
查看>>
Java 和 Object-c的区别
查看>>
Windows环境下Android NDK环境搭建
查看>>
NDK Build 用法(NDK Build)
查看>>
Android NDK开发起步Hello Jni
查看>>
[已解决]AutoCompleteTextView 不显示匹配的内容,因为将空的内容添加进去了
查看>>
object c的浅拷贝(地址拷贝)和深拷贝(对象拷贝)
查看>>
object c son字符串的解析
查看>>
object c 非常强大的类的属性复制kcv键值码赋值
查看>>
Java中普通代码块,构造代码块,静态代码块区别及代码示例
查看>>