例8.1 城市A到城市B的交通图:
A->:b,c,d,f;
B->:a,f;
C->a,d,e;
D->a,d,g;
E->c,g,h;
F->a,b,h;
G->d,e,h;
H->e,f,g
从路线中可以看出A到H要经过若干个城市,现在要找出一条经过城市最少的路线

分析:
1.很容易想到用邻接矩阵来表示,0表示能走,1表示不能走
2.邻接矩阵最短路径想到用队列来表示
3.a数组是存储扩展节点的队列,a[i]记录经过的城市,b[i]记录前趋城市
4.将城市A入队,队首为0,队尾为1
5.将队首所指的城市所有可直通的城市入队(若出现过就不入队),将入地城市的前趋城市保存在b[i]中,
6.然后将队首加1,得到新的队首城市。重复以上步骤直到搜到H结束。
#include <iostream>
#include<bits/stdc++.h>
using namespace std;int ju[9][9]{{0,0,0,0,0,0,0,0,0},{0,1,0,0,0,1,0,1,1},//a和a之间是1,是不能走的{0,0,1,1,1,1,0,1,1},{0,0,1,1,0,0,1,1,1},{0,0,1,0,1,1,1,0,1},{0,1,1,0,1,1,1,0,0},{0,0,0,1,1,1,1,1,0},{0,1,1,1,0,0,1,1,0},{0,1,1,1,1,0,0,0,1}
};
int a[101],b[101];
bool s[9];//输出过程
void out(int d){cout<<char(a[d]+64);while(b[d]){d=b[d];cout<<"--"<<char(a[d]+64);}cout<<endl;
}//BFS算法实现
void doit(){//数据初始化int head,tail,i;head=0;//队首为0tail=1;//队尾为1,因为a到a不能算a[1]=1;//记录经过的城市,现在第一个经过的是a本身b[1]=0;//记录前趋城市,a前面还没有城市s[1]=1;//表示该城市已经到过,现在已经到过a//循环判断do{head++;//队首加1,出队,从上一个城市往后走,第一次是从a开始for(i=1;i<=8;i++){//搜索可直达的城市if((ju[a[head]][i]==0&&(s[i]==0))){//下个城市能直达并且没被走过,就是可走tail++;//队尾加1a[tail]=i;//将i入队b[tail]=head;//记录tail的前趋城市s[i]=1;//记录该城市已经走过if(i==8){//第一次搜到的H城市最短out(tail);head=tail;break;}}}}while(head<tail);
}//主函数
int main(){memset(s, false, sizeof(s));doit();return 0;
}

运行结果:

总结:

广度优先搜索的核心思想
实际上是一个先进先出的队列(FIFO)
从初始节点开始,应用算符生成第一层节点,检查目标节点是否在这些后继节点中,
若没有,再用产生式规则将第一层的节点逐一扩展,得到第二层节点,并逐一检查第二层节点中是否包含目标节点,
若没有,再用算符逐一扩展到第二层的所有节点···
如此依次扩展,检查下去,直到发现目标节点为止

补充:

刚开始有点不太懂,即使懂了思想但是代码也不太理解,

但是画过图之后就比较容易理解了,这里以邻接链表为例

(参考青岛大学王卓老师的视频:https://www.bilibili.com/video/av36337654?from=search&seid=17495355141589125432)

初始时:

先访问v1,他有两个子节点,所以将v2,v3入队

(类似于邻接矩阵中的

if((ju[a[head]][i]==0&&(s[i]==0))){//下个城市能直达并且没被走过,就是可走tail++;//队尾加1a[tail]=i;//将i入队b[tail]=head;//记录tail的前趋城市s[i]=1;//记录该城市已经走过)

然后从v2开始访问,它的三个子节点是v1,v4,v5(对应序号是0,3,4)

v1访问过了,所以只用将v4,v5入对就可以了

以此类推,后面就是从v3开始,再将v6,v7入队

后面就是依次入队,出队..................

广度优先搜索算法1-已知若干个城市的路线,求从一个城市到另外一个城市的路径,要求路径中经过的城市最少。相关推荐

  1. Python实现“已知三角形两个直角边,求斜边”

    用Python实现"已知三角形两个直角边,求斜边" 要求:用户输入两个直角边(数值为浮点类型),若非浮点类型,则提示用户,继续输入. 思路:伪代码描述下步骤 1.-input a ...

  2. (海伦公式)已知三角形三条边长,求面积

    (海伦公式)已知三角形三条边长,求面积 海伦公式:  S=(△)=√[p(p-a)(p-b)(p-c)]  其中p是三角形的周长的一半p=(a+b+c)/2. ----以下转自百度百科-------- ...

  3. python已知两条直角边求斜边,Python实现“已知三角形两个直角边,求斜边”

    用Python实现"已知三角形两个直角边,求斜边" 要求:用户输入两个直角边(数值为浮点类型),若非浮点类型,则提示用户,继续输入. 思路:伪代码描述下步骤 1.-input a ...

  4. 【C#】已知圆心上的三点求圆心

    已知圆心上的三点:,, ,求圆心: 把三点坐标圆的方程: 得: 把  展开整理得: 令 ; ; , , ,  求 求 把  移项整理得: 把  移项整理得: 还原代入式子: 整理结果 简化: 其中: ...

  5. 小程序转盘抽奖,已知圆心、半径、角度求圆上点的坐标

    因公司的需求,要在小程序语音房内部迭代一个真心话大冒险的功能,也等同于幸运转盘: 业务场景: 发送一个socket,拿到响应的结果,根据返回的数值开始启动幸运转盘,由于转盘上的人数不是固定的,所以要根 ...

  6. java练习题 有50枚硬币,可能包括4种类型:1元,5角,1角,5分。已知总价值为20元。求各种硬币的数量。

    问题 有50枚硬币,可能包括4种类型:1元,5角,1角,5分.已知总价值为20元.求各种硬币的数量. 解决思路 对付这一类的问题,最简单的方式莫过于暴力穷举,就是用四个循环,一个一个试,结果满足要求输 ...

  7. 使用函数求最大公约数 pta_使用PRODUCT函数计算乘积,已知单价、数量、折扣率求商品金额...

    哈喽,今日头条的小伙伴们大家好,我是你们的好朋友IT咨询顾问. 使用PRODUCT函数可以求数组数值的乘积.例如,根据"定价""数量""消费税&quo ...

  8. python直角三角形的两个直角边、求斜边_Python实现“已知三角形两个直角边,求斜边”...

    用Python实现"已知三角形两个直角边,求斜边" 要求:用户输入两个直角边(数值为浮点类型),若非浮点类型,则提示用户,继续输入. 思路:伪代码描述下步骤 1.-input a ...

  9. 已知若干点求圆心_【求精干货】高中数学知识点总结归纳高一学生必须掌握

    高中数学高考知识点总结高一必高中数学高一的学生离高考还有两年的时间,别看这两年感觉很长,其实时间一晃就过了,高中数学学习成绩不太好的同学该加油好好学习了.别等到最后一年累死累活的搞,还不一定有效果,今 ...

  10. 已知像素焦距与图片像素求毫米焦距

    焦距为mm,而不是像素.将已知的焦距(像素)转换为毫米的公式: F(mm) = F(pixels) * SensorWidth(mm) / ImageWidth (pixel). 若已知图片像素为30 ...

最新文章

  1. 一个监控磁盘的nagios脚本
  2. Vue.js 状态过渡
  3. 出现“ORA-28000:the account is locked”的解决办法
  4. vue,一路走来(10)--生产环境
  5. Silverlight中枚举并加载客户端程序集
  6. 超多干货!支撑起腾讯公司计费业务的TDSQL(附PPT)
  7. ux的重要性_UX中清晰的重要性
  8. [导入]如何调试你的C#程序
  9. QCC3008项目实战:BlueVest体感背心
  10. HbuilderX如何创建一个新的Vue工程
  11. 随着年龄增长,我应该怎样对抗肌肉流失?
  12. 美国电话号码格式化的Objective-C代码
  13. 用java写修改器_一些修改器1
  14. 华为云服务器默认jdk版本,华为云服务器centos7.3 安装jdk
  15. iconfont图标无法显示的问题
  16. Python Journey - Day2 - 基本数据类型
  17. CCF CSP 点亮数字人生(记忆化搜索+拓扑排序判环)
  18. js预编译 GO 和AO
  19. 【魔兽争霸3地图编辑】vJass 教程
  20. java缺省包详解_Java在其它包中无法引用缺省包中的类

热门文章

  1. ppt如何替换其他mo ban_超实用办公软件小技巧之PPT~
  2. 绩效考核的五大原则,你知道吗?
  3. 解决jupyter notebook :No module named ‘tensorflow‘ 及python.exe无法找到入口问题及500 : Internal Server Error
  4. cent ultraiso_园丁cent vs千足的web ai应用
  5. lnsist不是insist
  6. GetX概览 — Flutter 开发的百宝箱
  7. 数据结构分类之什么是线性结构、非线性结构
  8. 你的CRM系统为什么用不起来?
  9. RingBuffer的快速上手使用方法
  10. 信号完整性之铜皮粗糙度