题目描述:

小哼和小哈一同坐飞机去旅游,他们现在位于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;
}

【数据结构】广度优先遍历 最小转机问题相关推荐

  1. 分别用邻接矩阵和邻接表实现图的深度优先遍历和广度优先遍历_数据结构|图的邻接表与深度、广度优先搜索

    线性存储元素时,元素的关系也同时确定了.而非线性数据结构就不同了,需要同时考虑存储数据元素和数据元素的关系. 由于图的结构比较复杂,任意两个顶点之间都可能存在联系,因此无法以数据元素在存储区中的物理位 ...

  2. 数据结构之图:邻接矩阵和邻接表、深度优先遍历和广度优先遍历

    简介 线性表是一种线性结构,除了头结点和尾节点,线性表的每个元素都只有一个前取节点和一个后继节点.而树结构则相较于线性表更加复杂,它描述的关系为数据元素之间的父子关系,也是现实世界父子关系的缩影, 一 ...

  3. 数据结构-深度优先遍历和广度优先遍历(漫画)

    -----  第二天  ----- ------------ 什么是 深度/广度 优先遍历? 深度优先遍历简称DFS(Depth First Search),广度优先遍历简称BFS(Breadth F ...

  4. 【图数据结构的遍历】java实现广度优先和深度优先遍历

    [图数据结构的遍历]java实现广度优先和深度优先遍历 宽度优先搜索(BFS)遍历图需要使用队列queue数据结构: 深度优先搜索(DFS, Depth First Search)的实现 需要使用到栈 ...

  5. 数据结构与算法:终于可以用三种语言(C,C#,JavaScript)把图的广度优先遍历讲清楚了(推荐收藏)

    文章目录 邻接矩阵存储图的广度优先遍历过程分析 C语言实现队列编程 程序中加入图的处理函数 结果的再次分析 C#语言实现图的广度优先遍历.并显示广度优先遍历生成树 JavaScript语言实现图的广度 ...

  6. 【数据结构与算法】广度优先遍历(BFS) 深度优先遍历(DFS)

    一. 搜索算法 深度优先搜索和广度优先搜索是最暴力的图的搜索算法.算法的目标是,给定一张图,一对初始和终止节点,找到两节点之间的节点路径.(代码均是找到两个节点之间的路径) 广度优先搜索是一层一层搜索 ...

  7. 树的基本概念和遍历规则 数据结构和算法 二叉树遍历(前序、中序、后序、层次、深度优先、广度优先遍历)

    zsychanpin 博客园 首页 新随笔 联系 订阅 管理 树的基本概念和遍历规则 树的递归定义 树是n(n>0)个结点的有限集,这个集合满足下面条件:       ⑴有且仅有一个结点没有前驱 ...

  8. 【2023王道数据结构】【图】通过C++实现图的BFS(广度优先遍历)算法求单源最短路径问题C、C++完整实现(可直接运行)

    ~~~笔锋至此又怎能平淡而终,故事开始便不承认普通✌✌✌ ✌ 题目及题解持续更新中 [2023王道数据结构目录]课后算法设计题C.C++代码实现完整版大全 题目: 通过C++实现图的BFS(广度优先遍 ...

  9. 数据结构(廿五) -- C语言版 -- 图 - 图的遍历 -- 邻接矩阵 - 深度/广度优先遍历/搜索(DFS、BFS)

    内容预览 零.读前说明 一.概 述 二.深度优先遍历(DFS) 2.1.无向图的遍历过程 2.2.有向图的遍历过程 2.3.总结说明 2.4.实现源代码 三.广度优先遍历(BFS) 3.1.广度优先的 ...

最新文章

  1. Uva - 12545 - Bits Equalizer
  2. Knockout2.x:ko.dataFor()、ko.contextFor()使用
  3. symmetric-tree
  4. Python中collections模块
  5. JNI传递字符串数组J-StringArray
  6. why my SAP UI5 filter by titleID does not work
  7. mysql空洞数据,Mysql 表空间和 数据页空洞
  8. 中国互联网的第二次“千团大战”已经开始了
  9. Python MySQL(MySQLdb)
  10. C# static变量、const变量、readonly变量
  11. 测试人员该学习哪些Linux知识
  12. 学知识的时候,把自己放的低一点
  13. 影视导航资源库api php,影视资源采集站
  14. MAC-多开程序两种方法
  15. 图的深度优先遍历及广度优先遍历
  16. SQL 数据库 学习 004 预备知识
  17. 汇编基础2:看懂汇编
  18. redis cluster C 客户端
  19. 五大列级庄_1855列级庄分级
  20. 养QQ宠物不花Q币?完全可以!(转)

热门文章

  1. 语言常用c100单词,英语文化_夏普新款PW-C100-G电子词典测评_沪江英语
  2. android 文件MD5加密 对SD卡的操作
  3. matlab 绘制一个可爱的胖娃娃
  4. 在家运动买什么器材好、618值得入手的运动装备指南
  5. 12平键标准尺寸规格表_平键标准尺寸|平键和键槽的标准尺寸规格表
  6. dos皇帝攻略_DOS游戏之皇帝攻略二
  7. 俞敏洪:我让女儿主动学习的秘密,做家长的都该看看!
  8. 严格劣势策略和弱劣势策略
  9. 数字化时代-25:扎心的思考,工程技术人员如何摆脱被长期剥削的命运?工程技术人员应有的知识产权的意识.
  10. CentOS 6.0 图形(图解)安装教程