我想大部分读者都用Floyd或者Dijstra算法,甚至dfs算过最短路吧。
其实BFS也可以计算最短路。(补充:本文只针对无权图,有权图很难用BFS)
当我们用BFS找端对端最短路时,从出发点开始,第一次遍历到终点时过的那条路径就是最短的路径。(读者可以思考一下为什么!)
下面就用邻接表来实现一下BFS最短路,并把路径打出来。
#include<iostream>
#include<fstream>
#include<queue>
using namespace std;
const int MAX = 50;
struct link
{
int data;
link *next;
};
struct Node
{
int v; //顶点相关的信息
link *next;
};
struct Graph
{
Node node[MAX+1]; //所有的结点
int nodeCnt; //用来记录图中结点的数目,这里假设用的是连通图。假设不连通,稍微改一下本程序就行了,具体操作留给读者思考!
};
int visited[MAX+1]; //标志数组
int pa[MAX+1];
/* 读取文件中的数据,构造一个邻接表来表示图 */
Graph readGraph()
{
ifstream cin("c:\\graph.txt");
//表的初始化
Graph graph;
int i ;
for(i = 1; i < MAX; i ++)
{
graph.node[i].v = i;
graph.node[i].next = NULL;
}
int n1 = 0,n2 = 0;
link *s;
graph.nodeCnt = 1;//把结点数初始化为1
while(cin>>n1>>n2)
{
if(graph.nodeCnt < n1) graph.nodeCnt=n1;
if(graph.nodeCnt < n2) graph.nodeCnt=n2;
s = new link;
s->data = n2;
s->next=graph.node[n1].next;
graph.node[n1].next=s; //从尾部插入
//delete(s);
s=new link;
s->data = n1;
s->next=graph.node[n2].next;
graph.node[n2].next=s; //反过来也赋值,说明本程序测试的是无向图,如果是有向图的话读者应该知道怎么改了吧!
//delete(s);
}
return graph;
}
/* 打印邻接表 */
void printGraph(Graph graph)
{
link *p;
for(int i = 1; i <= graph.nodeCnt; i ++)
{
cout<<graph.node[i].v<<" -- ";
p=graph.node[i].next;
while(p!=NULL)
{
cout<<p->data;
p=p->next;
if(p != NULL)
cout<<",";
}
cout<<endl;
}
}
/* 用BFS求最短路径 */
void shortestPath(Graph graph, int s, int d)
{
cout<<"从"<<s<<"到"<<d<<"的bfs最短路求解过程如下:"<<endl;
queue<int> que ;
link * p = NULL;
//int cnt = 0;
int parents = s;
memset(visited,0,sizeof(visited));
memset(pa,0,sizeof(pa));
visited[s] = 1;
pa[s] = -1;
que.push(s);
while(!que.empty()){
p = graph.node[que.front()].next;
parents = que.front();
que.pop();
//cnt ++;
while(p != NULL)
{
if(!visited[p->data])
{
visited[p->data] = 1;
pa[p->data] = parents;
cout<<"访问:"<<p->data<<endl;
if(p->data == d) //找到了目标结点
{
//cout<<"在第"<<cnt<<"层找到目标结点!(出发点算第一层)"<<endl;
break;
}
que.push(p->data);
}
p = p->next;
}
}
cout<<"路径如下:"<<endl;
parents = d;
//cout<<parents<<" <- ";
while(pa[parents] != -1)
{
cout<<parents<<" <- ";
parents = pa[parents];
}
cout<<parents<<endl;
}
int main()
{
int s,d;
Graph graph = readGraph();
printGraph(graph);
while(true)
{
cout<<"请输入起点和终点:"<<endl;
cin>>s>>d;
shortestPath(graph, s , d);
}
return 0;
}
输入文件graph.txt里数据格式如下:
1 2
1 3
1 4
2 4
分享到:
相关推荐
- 程序应提供构造迷宫、输出迷宫、寻找最短路径和打印路径的功能。 2. **概要设计**: - 定义一个栈 ADT Stack,包括初始化、获取栈长度、判断是否为空、获取栈顶元素、压栈和弹栈等操作。 - 设计主程序模块,...
紧急救援最短路+路径打印 链表去重模拟链表 月饼贪心 这是二叉搜索树吗?数据结构 集合相似度STL 树的遍历数据结构 家庭房产并查集 最长对称子串字符串 抢红包排序 排座位dfs 玩转二叉树数据结构 关于堆的判断 红色...
基于Andorid的音乐播放器项目改进版本设计实现源码,主要针对计算机相关专业的正在做毕设的学生和需要项目实战练习的学习者,也可作为课程设计、期末大作业。
uniapp-machine-learning-from-scratch-05.rar
game_patch_1.30.21.13250.pak
【毕业设计-java】springboot-vue计算机学院校友网源码(完整前后端+mysql+说明文档+LunW).zip
特征变换 特征选择
吸烟数据集 991张原始图片,平均识别率在88.3% coco json格式标注
c++万能头文件picture.h
spaceX 动力学分析
python教程学习
内容概要:本文详细整理了与uniapp有关的一系列学习资源及开发工具。首先对官方文档与教程进行梳理,这是学习uni-app的基础部分,涵盖从基本概念到具体开发指引的全方位资料。接着详细介绍了一款专为uni-app打造的高效开发工具HBuilderX的功能特点及其使用指南,并提到了CLI命令行工具可用于完成开发过程中的常规操作任务。同时,指出uni-app所处的强大社区氛围,无论是社区还是论坛都为开发者解决了实际遇到的问题并分享了大量有价值的经验;还提及多个专门为uni-app量身定制的UI框架和丰富的组件库,进一步提高了开发的便捷性和灵活性;最后列举了几类学习资源,诸如视频教程、博客与文章还有相关书籍均能助力新手成长为熟练工。所有这些资源都将有助于深入学习和理解uni-app这个跨平台框架的相关知识点,进而开发出优秀的多平台应用程序。 适用人群:有意进入跨平台移动应用开发领域的初学者,以及希望提升开发技能的专业人士。 使用场景及目标:为想要深入了解或者开始使用uni-app框架进行开发的人群提供完整路径指导;为目标受众建立起一套完整的学习路径来降低入门难度并提升实际操作能力。
AI Agent 行业研究报告.pdf
请到网盘中自取压缩包,此包为kibana-7.10.2 镜像压缩包,是通过现有镜像导出来的,主要是为了解决有些机器无法连接外网,导致无法下载镜像 加载镜像: docker load -i kibana-7.10.2.tar 查看镜像: docker images 备注:elk此镜像配套资源,相同版本的elasticsearch和logstash,请在我的资源中搜索其他镜像
图解AUTOSAR-CP-TcpIp逻辑图打包
【毕业设计-java】springboot-vue交友网站平台实现源码(完整前后端+mysql+说明文档+LunW).zip
海康相机平场矫正对比图
python教程学习
【论文+PPT+代码+开题+任务书】手机APP遥控的相关测试主要完成设计当中按键控制对应继电器是否正确打开以及关上,可以通过观察按下按键时继电器想匹配的LED是否点亮来进行验证。 进入手机APP后,根据APP中的按键分别控制不同的继电器,继电器1这个按键控制对应1号继电器的开启和关闭,手机蓝牙按下按键由OFF转变为ON那么电控制器件就可以变化一次,1号指示灯就可以由暗变亮了,再次按下手机蓝牙按键由ON转变为OFF电控制器件又变化一次,1号指示灯就可以由亮变暗。 如果点击继电器2则控制对应2号继电器的开启和关闭,手机蓝牙按下按键由OFF转变为ON那么电控制器件就可以变化一次,2号指示灯就可以由暗变亮了,再次按下手机蓝牙按键由ON转变为OFF电控制器件又变化一次,2号指示灯就可以由亮变暗。 如果点击继电器3则控制对应3号继电器的开启和关闭,手机蓝牙按下按键由OFF转变为ON那么电控制器件就可以变化一次,3号指示灯就可以由暗变亮了,再次按下手机蓝牙按键由ON转变为OFF电控制器件又变化一次,3号指示灯就可以由亮变暗。 如果点击继电器4则控制对应4号继电器的开启和关闭
【毕业设计】java-springboot+vue教师人事档案管理系统实现源码(完整前后端+mysql+说明文档+LunW).zip