最短路径问题,BFS,408方向,思路与实现分析

继上回挖下的坑,不知道大家有没有认真看最小生成树呢?很简单,这回也讲讲正常难度的,看不懂就来这里看看,讲的很好~~

最短路径问题

说起这个问题,先说个问题吧~~

这回不修路了,这回运东西哈哈哈,abcde五个城市,a是丝绸产业重地,那么经常要往,bcde4个城市运东西,那么到各个城市怎么运送距离最近呢?图示见下~~

a分别到各个城市运送,这是一个单源最短路径问题~~

那么如果各个城市之间都有特产,需要相互的两两之间运送距离最近呢?这就是各顶点之间的最短路径问题~

所以明确一下,要搞的这三个算法当然是有适用范围的~~

单源最短路径-BFS求无权图思路

BFS其实也就是广度优先遍历,图的广度优先遍历这里我们来模拟一下~~

当然,无权图你也可以想象成权值为一的特殊带权图嘛~~

第一次遍历,我们访问的元素应该是1和6~~

第二次遍历,我们访问的元素应该是5,3和7~~

第三次遍历,我们访问的元素应该是4和8~~

BFS代码实现与分析

先来代码~~

void BFS_MIN_Distance(Graph G,int u)
{ for(i = 0;i < G.vexnum; ++i)
{
d[i] = false; //单源到各点路径长度的最短路径,先初始化,false代表不可到达
path[i] = -1; //最短路径从哪个顶点过来,先初始化
}
d[u] = 0;
visited[u] =TRUE; //标记顶点u已被标记
EnQueue(Q,u);//顶点u入队列
while(!isEmpty(Q))//主过程
{
DeQueue(Q,u);//顶点u出队列
for(w = FirstNeighbor(G,u); w >= 0; w = NextNeighbor(G,u,w))
{ //遍历当前出队列的元素的所有邻接顶点,第一次为遍历顶点u的所有邻接顶点
//当前出队列的元素即跳出for循环之后,再进入for循环时,本例中,u即为1号元素
if(!visited[w]) //w为u为尚未访问的邻接顶点
{
d[w] = d[u] +1;//路径长度加1
path[w] = u; //最短路径为u到w
visited[w] = TRUE;//标记顶点w已被标记
EnQueue(Q,w);//顶点w入队列
}
}
}
}

我们需要列出3块内容帮助我们分析~~

visited数组:

1 2 3 4 5 6 7 8
visited false false false false false false false false

队:开始的时候没有元素~~

d[]和path[]数组

1 2 3 4 5 6 7 8
d[] false false false false false false false false
path[] -1 -1 -1 -1 -1 -1 -1 -1

分析一下到while主过程之前,我们做的事情~~

visited数组:

1 2 3 4 5 6 7 8
visited false true false false false false false false

队: 2 ,u为2

d[]和path[]数组

1 2 3 4 5 6 7 8
d[] false 0 false false false false false false
path[] -1 -1 -1 -1 -1 -1 -1 -1

那么此时进入while循环~~

第一次while循环,2出队~~

队: 空,此时2出队了~~

进入for循环~~

第一次for,u为2,第一个邻接顶点为1,并且1尚未访问,所以路径长度加1,最短路径为u到w,即2到1,标记1已访问,1入队,w=NextNeighbor,还有邻接顶点,所以继续~~

第二次for,第二个u的邻接顶点,为6,并且6尚未访问所以路径长度加1,最短路径为u到w,即2到6,标记6已访问,6入队,w=NextNeighbor,没有邻接顶点了所以跳出~~

此时

visited数组:

1 2 3 4 5 6 7 8
visited true true false false false true false false

队: 1,6 ,队头为1,所以u为1

d[]和path[]数组

1 2 3 4 5 6 7 8
d[] 1 0 false false false 1 false false
path[] 2 -1 -1 -1 -1 2 -1 -1

第二次while

1出队~~

进入for循环~~

第一次for,u为1,第一个邻接顶点为2,但是2已被访问,所以不执行if内语句,w=NextNeighbor,还有邻接顶点,所以继续~~

第二次for,第二个u的邻接顶点,为5,5尚未访问所以路径长度加1,此时因为d[u]初始为1,所以为1+1=2,最短路径为u到w,即1到5,标记5已访问,5入队,w=NextNeighbor,没有邻接顶点了所以跳出~~

此时

visited数组:

1 2 3 4 5 6 7 8
visited true true false false true true false false

队: 6 ,5,队头为6,所以u为6

d[]和path[]数组

1 2 3 4 5 6 7 8
d[] 1 0 false false 2 1 false false
path[] 2 -1 -1 -1 1 2 -1 -1

第三次while~~

6出队,再进行for循环,那么之后就会变成~~

visited数组:

1 2 3 4 5 6 7 8
visited true true true false true true true false

队: 5,3,7队头为5,所以u为5

d[]和path[]数组

1 2 3 4 5 6 7 8
d[] 1 0 2 false 2 1 2 false
path[] 2 -1 6 -1 1 2 6 -1

第四次whlie~~

5,出队,再进行for,没有邻接顶点,所以没有改变~~

visited数组:

1 2 3 4 5 6 7 8
visited true true true false true true true false

队: 3,7队头为3,所以u为3

d[]和path[]数组

1 2 3 4 5 6 7 8
d[] 1 0 2 false 2 1 2 false
path[] 2 -1 6 -1 1 2 6 -1

第五次while~~

3出队,进行for,此时~~

visited数组:

1 2 3 4 5 6 7 8
visited true true true true true true true false

队: 7队头为7,所以u为7

d[]和path[]数组

1 2 3 4 5 6 7 8
d[] 1 0 2 3 2 1 2 false
path[] 2 -1 6 3 1 2 6 -1

第六次whlie~~

7出队,进行for,此时~~

visited数组:

1 2 3 4 5 6 7 8
visited true true true true true true true true

队: 没有元素入队,队空了~~

d[]和path[]数组

1 2 3 4 5 6 7 8
d[] 1 0 2 3 2 1 2 3
path[] 2 -1 6 3 1 2 6 7

此时队空,跳出while,执行成功~~

此时,我们得到了d[]和path[]数组~~

1 2 3 4 5 6 7 8
d[] 1 0 2 3 2 1 2 3
path[] 2 -1 6 3 1 2 6 7

比如我们看4号元素,即可知~~

2到4号元素的最短路径为长度d[4] = 3;

2到4号元素的最短路径为: 看4号元素path[4]为3,4 <- 3,再看3号元素path[3]为6,3 <- 6 ,再看6号元素path[6]为2,6 <- 2,所以2到4的最短路径为:2 -> 6 -> 3 -> 4~~

写到这才发现一写就挺多的,那Dijkstra,Floyd算法就下次再写咯~~

最短路径问题,BFS,408方向,思路与实现分析的更多相关文章

  1. 最小生成树,Prim算法与Kruskal算法,408方向,思路与实现分析

    最小生成树,Prim算法与Kruskal算法,408方向,思路与实现分析 最小生成树,老生常谈了,生活中也总会有各种各样的问题,在这里,我来带你一起分析一下这个算法的思路与实现的方式吧~~ 在考研中呢 ...

  2. poj 2251 三维地图最短路径问题 bfs算法

    题意:给你一个三维地图,然后让你走出去,找到最短路径. 思路:bfs 每个坐标的表示为 x,y,z并且每个点都需要加上时间 t struct node{ int x, y, z; int t;}; b ...

  3. Z1. 广度优先搜索(BFS)解题思路

    /** BFS 解题思路 特点:从某些特定的节点开始,感染相邻的节点; 被感染的节点,再感染其相邻的节点,以此类推. 题目常见于数据结构包括 二维数组.树.图 **/ /** 1). 二维数组特定节点 ...

  4. CDOJ 1964 命运石之门【最短路径Dijkstra/BFS】

    给定数字n,m(1<=n,m<=500000) 将n变为n*2花费2,将n变为n-3花费3,要求过程中所有数字都在[1,500000]区间内. 求将n变为m的最少花费 思路:建图 将每个数 ...

  5. POJ 1101 The Game(BFS+判方向)

        The Game Description One morning, you wake up and think: "I am such a good programmer. Why ...

  6. 挑战程序设计——迷宫的最短路径(BFS)

    题目详情 Description 给定一个大小为 N * M 的迷宫.迷宫由通道和墙壁组成,每一步可以向邻接的上下左右四格的通道移动.请求出从起点到终点所需的最小步数 限制条件: N,M <= ...

  7. hdu1180 优先队列bfs+判断方向

    诡异的楼梯 Time Limit: 2000/1000 MS (Java/Others)    Memory Limit: 131072/65536 K (Java/Others)Total Subm ...

  8. B - ACM小组的古怪象棋 【地图型BFS+特殊方向】

    ACM小组的Samsara和Staginner对中国象棋特别感兴趣,尤其对马(可能是因为这个棋子的走法比较多吧)的使用进行深入研究.今天他们又在 构思一个古怪的棋局:假如Samsara只有一个马了,而 ...

  9. E - A strange lift 【数值型BFS+上下方向】

    There is a strange lift.The lift can stop can at every floor as you want, and there is a number Ki(0 ...

随机推荐

  1. 用 vitePress 快速创建一个文档项目

    其实开发一个项目最需要的就是操作文档,文档的质量决定了项目的开发流程,开发规范等等. 对于前端框架来说,文档最友好的还是vue,不仅是中国人的框架,而且文档支持了中文.仔细查看 Vue 的官方文档,还 ...

  2. 【python】【补】Leetcode每日一题-合并两个有序数组

    [python]Leetcode每日一题-合并两个有序数组 [题目描述] 给你两个有序整数数组 nums1 和 nums2,请你将 nums2 合并到 nums1 中,使 nums1 成为一个有序数组 ...

  3. idea中properties配置文件没有代码提示及代码高亮问题解决方案

    更多精彩关注微信公众号 1.解决properties文件没有代码提示问题:首先,单击项目结构按钮,如下图: 然后,给项目添加Spring依赖支持,如下图: 2.解决代码不高亮问题:     代码不高亮 ...

  4. SpringBoot+MyBatis练手项目笔记汇总

    以下是我在练习SpringBoot+MyBatis训练时候个人一些笔记汇总(可以点击跳转),献丑了,网上很多大佬的文章都比我写的详细,一些好的文章,我会将贴到各个内容中. 1. 插入数据返回id和内部 ...

  5. Spring MVC工作原理及源码解析(三) HandlerMapping和HandlerAdapter实现原理及源码解析

    1.HandlerMapping实现原理及源码解析 在前面讲解Spring MVC工作流程的时候我们说过,前端控制器收到请求后会调⽤处理器映射器(HandlerMapping),处理器映射器根据请求U ...

  6. 推荐系统论文之序列推荐:KERL

    KERL: A Knowledge-Guided Reinforcement Learning Modelfor Sequential Recommendation 摘要 ‍时序推荐是基于用户的顺序行 ...

  7. BUAA软件工程_软件案例分析

    写在前面 项目 内容 所属课程 2020春季计算机学院软件工程(罗杰 任健) (北航) 作业要求 软件案例分析 课程目标 培养软件开发能力 本作业对实现目标的具体作用 对案例进行分析以学习软件开发的经 ...

  8. Nifi:nifi的基本使用

    Nifi的安装使用 Nifi安装 首先说一下Nifi的安装,这里Nifi可以支持Windows版和Linux,只需要去官网:http://nifi.apache.org/ 根据自己需要的版本,选择下载 ...

  9. [Java] Hibernate

    背景 持久化技术框架 封装了JDBC做数据库相关功能开发的重复性工作 比如创建连接,关闭连接,把字段逐一映射到属性中等 使用 在数据库中创建表 创建java project 导入hibernate依赖 ...

  10. CentOS 7 vs. CentOS 8 版本差异大比拼

    CentOS 7 vs. CentOS 8 版本差異大比拼 2020-02-14 CentOS 最近剛好在撰寫課鋼,必須要以最新的 CentOS 8 版本為主,剛好來做一下 CentOS 7 和 Ce ...