我一直认为用C语言来描述数据结构(尤其是这种简单的)是一个非常不错的方式。

C语言在表示数据,存取数据,表现数据结构里都没有那么多“捷径”可以走,所以用C语言写基础的数据结构的代码,是非常方便读者理解的。

毕竟,C语言极有可能成为一个程序员的入门语言。

题目描述


小哼和小哈一同坐飞机去旅游,他们现在位于1号城市,目标是5号城市,可是1号城市并没有到5号城市的直航。不过小哼已经收集了很多航班的信息,现在小哼希望找到一种乘坐方式,使得转机的次数最少,如何解决呢?

输入:

5 7 1 5
1 2
1 3
2 3
2 4
3 4
3 5
4 5

输出

2

题解

这是一个典型的广度优先查找,查找从A点到B点的最少转机次数。

一开始不喜欢DFS,喜欢BFS,觉得递归实在是太复杂了。做完这题发现,BFS要理解好那个存储状态的队列也不容易。比如下面代码的que里面的s,在数组里每个s会是什么样子的呢?s什么时候+1呢?+1的时候是基于什么的呢?这里逻辑就有点绕了。

不过机智的我还是弄明白了,对于每次s要+1的时候,取决于现在的头指针指向的哪个点(即本次转机的出发机场是哪里)。

最后,输出尾指针-1(因为尾指针每次都要++以指向下一个空格子)里的s属性的值就可以。

具体可以看代码。

#include<stdio.h>
int a[2000][2000], book[2000];struct note
{int x;//城市编号int s;//转机次数
};
struct note que[2000];int main()
{int i, j, n, m, x, y, start, end;int cur, head, tail;scanf("%d %d %d %d", &n, &m, &start, &end);for (i = 1; i <= n; i++)for (j = 1; j <= n; j++)if (i == j)a[i][j] = 0;elsea[i][j] = 99999999;for (i = 1; i <= m; i++){scanf("%d %d", &x, &y);a[x][y] = 1;a[y][x] = 1;}head = 1;tail = 1;que[tail].x = start;que[tail].s = 0;book[1] = start;tail++;int flag = 0;while (head < tail){//当前正在访问的顶点的编号cur = que[head].x;// 从1~n进行尝试for (i = 1; i <= n; i++){if (a[cur][i] != 99999999 && book[i] == 0){que[tail].x = i;que[tail].s = que[head].s + 1; //转机次数+1,基于的是头指针下的stail++;book[i] = 1;}//如果tail>n则表示所有顶点都被访问过if (que[tail].x == n){flag = 1;break;}}if (flag == 1)break;//这里不要忘记,拓展完之后,要将头指针+1head++;}printf("%d ", que[tail - 1].s);return 0;
}

输出结果:

[C] 图的广度优先搜索——最少转机相关推荐

  1. Java实现算法导论中图的广度优先搜索(BFS)和深度优先搜索(DFS)

    对算法导论中图的广度优先搜索(BFS)和深度优先搜索(DFS)用Java实现其中的伪代码算法,案例也采用算法导论中的图. import java.util.ArrayList; import java ...

  2. 《算法图解》学习笔记(六):图和广度优先搜索(附代码)

    欢迎关注WX公众号:[程序员管小亮] python学习之路 - 从入门到精通到大师 文章目录 欢迎关注WX公众号:[程序员管小亮] [python学习之路 - 从入门到精通到大师](https://b ...

  3. 图的广度优先搜索(bfs)以及深度优先搜索(dfs)

    1.前言 和树的遍历类似,图的遍历也是从图中某点出发,然后按照某种方法对图中所有顶点进行访问,且仅访问一次. 但是图的遍历相对树而言要更为复杂.因为图中的任意顶点都可能与其他顶点相邻,所以在图的遍历中 ...

  4. 数据结构--图的广度优先搜索

    //图的遍历--广度优先搜索 void BreadFirstSearch(Graph g int v0){visit(v0);visited[v0] = True;InitQueue(&Q); ...

  5. bfs广度优先搜索算法_图的广度优先搜索(BFS)

    bfs广度优先搜索算法 What you will learn? 您将学到什么? How to implement Breath first search of a graph? 如何实现图的呼吸优先 ...

  6. 图的广度优先搜索遍历

    广度优先搜索遍历 广度优先搜索遍历类似与树的层次遍历,过程如下: (1) 从图中的某个顶点v出发,访问v (2) 依次访问v的各个未曾访问的邻接点 (3) 分别从这些邻接点出发依次访问他们的邻接点,并 ...

  7. 数据结构与算法--图的广度优先搜索 (BFS)

    广度优先搜索即是 一种"地毯式"层层推进的搜索策略,即先查找离起始顶点最近的,然后是次近的,依次往外搜索. BFS解决的最短路径问题. 采用BFS进行遍历的话,需要依赖队列,先进先 ...

  8. 图的广度优先搜索(BFS)和深度优先搜索(DFS)算法解析

    BFS和DFS算法解析 [算法入门] 2018/6/2 1.前言 和树的遍历类似,图的遍历也是从图中某点出发,然后按照某种方法对图中所有顶点进行访问,且仅访问一次. 但是图的遍历相对树而言要更为复杂. ...

  9. 图的广度优先搜索--python实现

    最近在看<算法图解>,第六章中的广度优先搜索中的题目.自己实现一遍,算是做个记录吧. 关系网络图如下: 目的:找到朋友与朋友的朋友这些人中,谁是 Seller. 大体思路: 首先使用散列表 ...

最新文章

  1. np.asarray和np.array、np.nanmean和np.mean、np.diff、
  2. TP-LINK821N无线网卡拆解分析
  3. JS一起学01:css复习、js基础知识、事件、参数、函数、网页换肤、if判断、className问题、浏览器执行顺序
  4. 8个容易被忽略但不能忽略的SD-WAN功能-Vecloud
  5. Programming C# 4th Edition 中文版/英文版 对照阅读体验
  6. git操作代码文件的颜色变化
  7. ctf镜子里面的世界_帮大爷干活,他送了我一只鞋子和一手套,又不能穿拿来做什么?哈哈哈|叶子|镜子|虫子|鞋子|棺材...
  8. 面向对象的数据存储方式
  9. Chapter1-2_Speech_Recognition(LAS)
  10. python中网页关闭再打开_Python Selenium 之关闭窗口close与quit的方法
  11. redis实例python_使用python操作redis(管道)
  12. Linux---管道通信的使用
  13. 代码编辑器横评:为什么 VS Code 能拔得头筹?| 程序员硬核评测
  14. scrapy Pipline保存到数据库
  15. VMD变分模态分解代码,C++代码下载
  16. 全国企业税收调查数据(2007-2016)共10年数据,均未脱敏。可通过纳税人识别号,识别具体企业名称和地区信息等,可匹配中国工业企业数据库,中国出口海关统计数据、中国企业污染排放数据库、中国海关数据
  17. matlab节约里程法_vrp几种算法的matlab源代码(扫描算法,禁忌搜索算法,节约里程算法)...
  18. 计算机it dt ct基础知识,ot是什么意思,什么是CT,IT,DT,OT
  19. html css 鼠标手势,CSS设置鼠标手势:cursor属性说明
  20. 【Bandit Algorithms学习笔记】EXP3算法理论证明

热门文章

  1. SVN用法大全,SVN除了update、commit还有什么
  2. 【Sql Server】DateBase-SQL调整
  3. python系统问题
  4. 反向词典_根据描述查找词语
  5. java.lang.NullPointerException异常原因及解决
  6. NVIDIA A100 GPUs上硬件JPEG解码器和NVIDIA nvJPEG库
  7. Python:Spider
  8. python 把集合转成字典的方法
  9. databinding 入门 知识 给TextView 赋值
  10. Tablayout 多个界面使用一个fragment 的实例