【数据结构】广度优先遍历 最小转机问题
题目描述:
小哼和小哈一同坐飞机去旅游,他们现在位于1号城市,目标是5号城市,可是0号城市并没有到4号城市的直航。
不过小哼已经收集了很多航班的信息,现在小哼希望找到一种乘坐方式,使得转机的次数最少,如何解决?
输入:
问题:
小哼和小哈一同坐飞机去旅游,他们现在位于1号城市,目标是5号城市,可是1号城市并没有到5号城市的直航。
不过小哼已经收集了很多航班的信息,现在小哼希望找到一种乘坐方式,使得转机的次数最少,如何解决呢?
验证数据:
5 7 0 4
0 1
0 2
1 2
1 3
2 3
2 4
3 4
第一行的5表示有5个城市(城市编号为1~5),7表示有7条航线,0表示起点城市,4表示目标城市。
c++模板和typedef的原理一样吗?
回答1:
不一样,typedef就是定义类型的别名,是纯粹的语法糖;
模板则相当于把你实例化过的各写一遍,只是减少了代码量,但程序会膨胀。
回答2:
4 、与函数模板的区别
函数模板,可以传递类型参数给到模板,让其根据需要生成我们需要的函数代码,这些代码的特点是参数类型可以不同,但是函数名相同,这样就方便我们调用。详见:C++模板简介。
typedef定义的是指向某一类函数的指针,这一类函数的参数类型和返回值类型都是相同的,只是函数名不同,用指针的的方法,将相同参数类型,但函数名不同的函数统一起来,方便我们使用。
二者目的相同,都是为了实现编写代码的简洁,但途径有所不同,函数模板是从函数生成的角度出发,生成函数名一致参数不同的代码;typedef是将函数名不同,参数类型相同的函数名称用指针别名的方法统一起来。
main.cpp
#include"Graph.h"void test(){//存储两个顶点之间边关系的数组int VI[14] = {0,0,2,2,2,3,3};int VJ[7] = { 1,2,1,4,3,1,4 };DataType v[5] = { 0,1,2,3,4 };cout << "存在航线的城市有:" << endl;Graph p(v, 5, 7,VI,VJ);cout << "输出所有城市:" << endl;int num=p.BFS();cout << endl;cout << "0号到4号城市之间的最少转机次数为:"<<num << endl;
}int main()
{test();system("pause");return 0;
}
Graph.h
#include<iostream>
#include<queue>
const int MAX = 10;
typedef int DataType;using namespace std;class Graph {private:DataType vertex[MAX]; //存放顶点的一维数组DataType arc[MAX][MAX]; //存放顶点间边关系的二维数组int arcNum, vertexNum; //边的个数,顶点个数int visited[MAX]; //访问数组public:Graph(DataType v[],int n,int e,int vi[],int vj[]);int BFS();
};
Graph.cpp
#include"Graph.h"//有参构造函数的实现
Graph::Graph(DataType v[], int n, int e, int VI[], int VJ[]) {//初始化顶点个数vertexNum = n;//初始化边的个数arcNum = e;//初始化顶点数组for (int i = 0; i < n; i++) {vertex[i] = v[i];}//初始化边数组for (int i = 0; i < MAX; i++)for (int j = 0; j < MAX; j++)arc[i][j] = 0;//初始化访问数组for (int i = 0; i < MAX; i++)visited[i] = 0;//一开始所有节点都处于未被访问的状态for (int i = 0; i < arcNum; i++) {//两个顶点之间的边关系int vi = VI[i];int vj = VJ[i];cout << vi << "<---->" << vj << endl;//这是无向图的边初始化标志arc[vi][vj] = 1;//有边的标志arc[vj][vi] = 1;}
}
int Graph::BFS(){int num = 0;//记录转机次数queue<DataType>q;for(int i=0;i<vertexNum;i++){if(visited[i]==0){visited[i] = 1;cout << vertex[i]<<" ";if(vertex[i] == 3){return num;}q.push(vertex[i]);while(!q.empty()){//q非空则执行q.pop();//遍历当前顶点在邻接矩阵中当前行,是否存在未被访问过的顶点for(int j=0;j<vertexNum;j++){if (arc[i][j] == 1 && visited[j] == 0){visited[j] = 1;cout<<vertex[j]<<" ";num++;q.push(vertex[j]);}if(vertex[i] == 3){return num;}}}}}return -1;
}
【数据结构】广度优先遍历 最小转机问题相关推荐
- 分别用邻接矩阵和邻接表实现图的深度优先遍历和广度优先遍历_数据结构|图的邻接表与深度、广度优先搜索
线性存储元素时,元素的关系也同时确定了.而非线性数据结构就不同了,需要同时考虑存储数据元素和数据元素的关系. 由于图的结构比较复杂,任意两个顶点之间都可能存在联系,因此无法以数据元素在存储区中的物理位 ...
- 数据结构之图:邻接矩阵和邻接表、深度优先遍历和广度优先遍历
简介 线性表是一种线性结构,除了头结点和尾节点,线性表的每个元素都只有一个前取节点和一个后继节点.而树结构则相较于线性表更加复杂,它描述的关系为数据元素之间的父子关系,也是现实世界父子关系的缩影, 一 ...
- 数据结构-深度优先遍历和广度优先遍历(漫画)
----- 第二天 ----- ------------ 什么是 深度/广度 优先遍历? 深度优先遍历简称DFS(Depth First Search),广度优先遍历简称BFS(Breadth F ...
- 【图数据结构的遍历】java实现广度优先和深度优先遍历
[图数据结构的遍历]java实现广度优先和深度优先遍历 宽度优先搜索(BFS)遍历图需要使用队列queue数据结构: 深度优先搜索(DFS, Depth First Search)的实现 需要使用到栈 ...
- 数据结构与算法:终于可以用三种语言(C,C#,JavaScript)把图的广度优先遍历讲清楚了(推荐收藏)
文章目录 邻接矩阵存储图的广度优先遍历过程分析 C语言实现队列编程 程序中加入图的处理函数 结果的再次分析 C#语言实现图的广度优先遍历.并显示广度优先遍历生成树 JavaScript语言实现图的广度 ...
- 【数据结构与算法】广度优先遍历(BFS) 深度优先遍历(DFS)
一. 搜索算法 深度优先搜索和广度优先搜索是最暴力的图的搜索算法.算法的目标是,给定一张图,一对初始和终止节点,找到两节点之间的节点路径.(代码均是找到两个节点之间的路径) 广度优先搜索是一层一层搜索 ...
- 树的基本概念和遍历规则 数据结构和算法 二叉树遍历(前序、中序、后序、层次、深度优先、广度优先遍历)
zsychanpin 博客园 首页 新随笔 联系 订阅 管理 树的基本概念和遍历规则 树的递归定义 树是n(n>0)个结点的有限集,这个集合满足下面条件: ⑴有且仅有一个结点没有前驱 ...
- 【2023王道数据结构】【图】通过C++实现图的BFS(广度优先遍历)算法求单源最短路径问题C、C++完整实现(可直接运行)
~~~笔锋至此又怎能平淡而终,故事开始便不承认普通✌✌✌ ✌ 题目及题解持续更新中 [2023王道数据结构目录]课后算法设计题C.C++代码实现完整版大全 题目: 通过C++实现图的BFS(广度优先遍 ...
- 数据结构(廿五) -- C语言版 -- 图 - 图的遍历 -- 邻接矩阵 - 深度/广度优先遍历/搜索(DFS、BFS)
内容预览 零.读前说明 一.概 述 二.深度优先遍历(DFS) 2.1.无向图的遍历过程 2.2.有向图的遍历过程 2.3.总结说明 2.4.实现源代码 三.广度优先遍历(BFS) 3.1.广度优先的 ...
最新文章
- 干货回顾丨TensorFlow四种Cross Entropy算法的实现和应用
- activemq高级客户端选项
- 051_InfiniteScroll无限滚动
- 沃流量 android,沃流量管家的身世之谜
- android 和h5交互,Android中与H5的交互
- ArrayList和Vector的异同
- 用行为树的方式思考问题
- @value 注入静态属性_TP6依赖注入是如何实现的
- 缺陷定位 | 如何精准效率分析推测BUG定位(二)
- Oracle 9i 返回一个记录集的方法
- Oracle标准审计实战过程详解
- 用c语言运行Linux命令,使用execv(C语言)从linux命令提示符运行命令
- 单例模式几种不同实现方式?
- Google 的垄断正在扼杀自由软件!
- 15个使用 CSS3 制作的漂亮作品展示网站
- 2E07-view-lists-Collapsed
- 第三方登录—QQ登录
- 硬盘主分区和逻辑驱动器的区别
- windows下安装mpich2
- Java配置环境变量(Windows)
热门文章
- 网易游戏数据挖掘实习生面试经历
- 搭建WordPres网站(博客网站/内容管理系统-CMS)
- vsftpd 权限 600 不能下载 vsftpd 不能删除 vsftpd 配置文件 linux 搭建 ftp 服务器
- vue中v-on支持的事件总结
- 有哪些值得推荐的电脑录屏软件与手机录屏软件?
- win10鼠标灵敏度怎么调_干货!灵敏度怎么调才能舒服压枪?看完这篇你就懂了!...
- Word中对一行/页眉同时设置左对齐和右对齐
- Excel2013破解vba工程密码以及工作表保护密码
- 【Git】Git是什么?简单说说Git的工作机制?Git的常用命令有那些?
- 更新Office出现0xc0000142解决方案