宽度优先算法本文主要以介绍算法思想为主,这里没有进行源代码的实现,但给出了推荐的数据结构和主要思想。
首先介绍宽度优先算法。 假设要寻找ab2点之间的最短距离。 以a为起点b为终点。 首先,可以遍历a的相邻节点。 这些节点称为主关系,如果它们不是主关系,则遍历主关系的相邻节点。 遍历的这些节点称为辅助关系。 这样遍历到b点时,该遍历路径为最短路径。
广度优先算法的实现:
宽度优先算法需要利用队列先进先出特性,首先对第一个节点进行排队,然后进入循环1234循环:
1 .每当第一个从队列中放入的节点弹出时
2 .确定该节点是否已遍历,根长度是否最佳,目的地节点是否为跳转循环
3 .遍历该节点的下一个节点,对满足条件的节点进行排队
4 .记录当前节点与当前节点的下一个节点关系。
以上图在准以下说明广度优先算法的具体实现步骤和思路。
阐述了广度优先算法的实现目的地使用了排队先进先出的特性,因此事先声明queue。 queue的元素是节点下标,声明map,key是当前节点的下标,value是结构(包括上一个节点下标与起点之间的距离)。
准备完成后,必须初始化队列和地图。 队列入队到0节点,贴图的密钥为0。 上一个节点可以设置为-1。 第一个节点前面的节点没有任何意义。 距离设定为0。 第一个节点和自己的距离当然是0。
已初始化的队列和地图
这种想法是,在每进行遍历时,从队列中退出,遍历相邻节点,满足请求后,相邻节点进入队列
遍历节点的信息存储在map中,可以用下标(key )看到节点的信息(value )
接下来进入主要循环扫描。
第一个循环:
搜索队列0节点、相邻节点1、2,注册到搜索到的队列、map
第二个循环:
将一个节点出队,搜索在相邻节点2、3处搜索到的入队,并注册map。 由于发现了2个节点,(可以在map中从key=2中发现) )判断长度为0-2=12,0-1-2=10,更新map,2之前的节点为1,距0时的距离为10
第三个循环:
退出团队2节点,搜索相邻节点4搜索到的入队,并向map进行注册
第四个循环:
走出团队3节点,搜索相邻节点2、4、5搜索到的入队,并向map注册。 2节点4节点都被搜索到了,所以比较长度0-1-2=10; 0-1-3-2=8更新map,通过2节点更新2节点4需要更新0-1-3-2-4=130-1-3-4=17更新map。
第五个循环:
走出团队4节点,搜索相邻节点5搜索到的入队,并向map进行注册。
第六个循环:
退出队伍,以5个节点为终点结束循环搜索。
总结以上的第三循环,宽度优先算法在节点间的距离不相等的情况下(需要判断节点间的距离),需要修改变更后的所有节点,例如循环3中的2个节点,例如循环3中的4个节点,进行操作其实这种节点之间的关系适合用Dijkstra算法来计算。
指向Dijkstra算法的链接: https://blog.csdn.net/QQ _ 33865609/article/details/117073021
以上文章的作者在网上找资料自己思考总结。 如果有不足的话请指导我。 谢谢你。