简述BFS与DFS

最近学习了数据结构课程以及应对蓝桥杯备考,所以花费了一点时间将比较重要的两个搜索BFS(宽度优先搜索)和DFS(深度优先搜索)大致思路以及代码整理出来,如有错误,还请各位大佬批评改正。

PS:用了几天时间试探着做了一个简单的静态网页,包括购买服务器,建站,以及代码编写,过几天我会给出具体流程。大牛勿喷 网站地址*/

##所谓搜索,实质就是遍历,只是在处理不同问题时加一些限制条件而已,比如走迷宫,则需要从出发点开始,向终点不断试探,当到达终点,则break提前结束遍历。
在这里推荐浙江大学PAT中计算图的连通集这道题,非常基础,下面我会给出题解。链接:浙大PAT连通集

DFS(深度优先搜索)

所谓深度,就类似树的先序遍历,形象的说就是一条路走到黑,如果走到头了,则返回上一个节点,所以我们很自然会想到用递归实现,另外加一个标记数组,确保节点只访问一次。(这里建议邻接矩阵跟标记数组全部使用全局变量,不然的话函数传参会很麻烦)

void dfs(int now)
{
cout << now << " ";
book[now] = 1;
for (int t = 0; t < point; t++)
{
if (shang[now][t] == 1 && book[t] == 0)
dfs(t);
}
return;
}

上述为DFS函数,每次递归后都会找到与之相邻的节点,并再次递归,直到所有节点全部遍历一次。

BFS(广度优先搜索)

所谓广度优先就类似树里面的层序遍历,每次访问的是同层的节点,同层访问后再继续向下访问,这里我们用队列来实现,利用队列的先进先出性质,每次递增访问,这样通过广度优先,我们可以得到迷宫的最短路径。

void bfs(int now)
{
struct quee q;
book[now] = 1;
q.number[q.top] = now;
q.top++;
//cout << endl<<endl<<endl<< q.tail << " " << q.top;
while (q.tail != q.top) {
now = q.number[q.tail];
q.tail++;
cout << now << " ";
for (int t2 = 0; t2 < point; t2++)
{
if (shang[now][t2] == 1 && book[t2] == 0)
{
q.number[q.top] = t2;
q.top++;
book[t2] = 1;
}
}
} }

浙大PAT列出所有连通集:
06-图1 列出连通集 (25分)
给定一个有N个顶点和E条边的无向图,请用DFS和BFS分别列出其所有的连通集。假设顶点从0到N−1编号。进行搜索时,假设我们总是从编号最小的顶点出发,按编号递增的顺序访问邻接点。

输入格式:
输入第1行给出2个整数N(0<N≤10)和E,分别是图的顶点数和边数。随后E行,每行给出一条边的两个端点。每行中的数字之间用1空格分隔。

输出格式:
按照{v1,v2,V3…}的格式,每行输出一个连通集。先输出DFS的结果,再输出BFS的结果。
输入样例:
8 6
0 7
0 1
2 0
4 1
2 4
3 5
输出样例:
{ 0 1 4 2 7 }
{ 3 5 }
{ 6 }
{ 0 1 2 7 4 }
{ 3 5 }
{ 6 }
看到题目就会觉得很基础,只是单纯的考一下BFS和DFS,用一个邻接矩阵将图的关系存入,然后分别调用两个函数,再按照样例格式输出即可
AC代码

#include<iostream>
using namespace std;
int point, leg;
int shang[1005][1005] = { 0 };
int book[1005] = { 0 };
struct quee
{
int top=0, tail=0;
int number[1005];
};
void dfs(int now)
{
cout << now << " ";
book[now] = 1;
for (int t = 0; t < point; t++)
{
if (shang[now][t] == 1 && book[t] == 0)
dfs(t);
}
return;
}
void bfs(int now)
{
struct quee q;
book[now] = 1;
q.number[q.top] = now;
q.top++;
//cout << endl<<endl<<endl<< q.tail << " " << q.top;
while (q.tail != q.top) {
now = q.number[q.tail];
q.tail++;
cout << now << " ";
for (int t2 = 0; t2 < point; t2++)
{
if (shang[now][t2] == 1 && book[t2] == 0)
{
q.number[q.top] = t2;
q.top++;
book[t2] = 1; }
}
} }
int main()
{
int L1, L2;
cin >> point >> leg;
for (int t = 0; t < leg; t++) {
cin >> L1 >> L2;
shang[L1][L2] = 1;
shang[L2][L1] = 1;
}
for (int t3 = 0; t3 < point; t3++)
{
if (book[t3] == 0) {
cout << "{ ";
dfs(t3);
cout << "}";
cout << endl;
} }
for (int t3 = 0; t3 < point; t3++)
book[t3] = 0;
for (int t3 = 0; t3 < point; t3++)
{
if (book[t3] == 0) {
cout << "{ ";
bfs(t3);
cout << "}";
cout << endl;
} }
}

简述BFS与DFS的更多相关文章

  1. HDU-4607 Park Visit bfs | DP | dfs

    题目链接:http://acm.hdu.edu.cn/showproblem.php?pid=4607 首先考虑找一条最长链长度k,如果m<=k+1,那么答案就是m.如果m>k+1,那么最 ...

  2. BFS和DFS详解

    BFS和DFS详解以及java实现 前言 图在算法世界中的重要地位是不言而喻的,曾经看到一篇Google的工程师写的一篇<Get that job at Google!>文章中说到面试官问 ...

  3. 算法录 之 BFS和DFS

    说一下BFS和DFS,这是个比较重要的概念,是很多很多算法的基础. 不过在说这个之前需要先说一下图和树,当然这里的图不是自拍的图片了,树也不是能结苹果的树了.这里要说的是图论和数学里面的概念. 以上概 ...

  4. hdu--1026--Ignatius and the Princess I(bfs搜索+dfs(打印路径))

    Ignatius and the Princess I Time Limit: 2000/1000 MS (Java/Others)    Memory Limit: 65536/32768 K (J ...

  5. 算法学习之BFS、DFS入门

    算法学习之BFS.DFS入门 0x1 问题描述 迷宫的最短路径 给定一个大小为N*M的迷宫.迷宫由通道和墙壁组成,每一步可以向相邻的上下左右四格的通道移动.请求出从起点到终点所需的最小步数.如果不能到 ...

  6. 【数据结构与算法】自己动手实现图的BFS和DFS(附完整源码)

    转载请注明出处:http://blog.csdn.net/ns_code/article/details/19617187 图的存储结构 本文的重点在于图的深度优先搜索(DFS)和广度优先搜索(BFS ...

  7. ACM__搜素之BFS与DFS

    BFS(Breadth_First_Search) DFS(Depth_First_Search) 拿图来说 BFS过程,以1为根节点,1与2,3相连,找到了2,3,继续搜2,2与4,相连,找到了4, ...

  8. BFS和DFS算法

    昨晚刚昨晚华为笔试题,用到了BFS和DFS,可惜自己学艺不精,忘记了实现原理,现在借用大佬写的内容给自己做个提高 转自:https://www.jianshu.com/p/70952b51f0c8 图 ...

  9. 通俗理解BFS和DFS,附基本模板

    1.BFS(宽度优先搜索):使用队列来保存未被检测的节点,按照宽度优先的顺序被访问和进出队列 打个比方:(1)类似于树的按层次遍历 (2)你的眼镜掉在了地上,你趴在地上,你总是先摸离你最近的地方,如果 ...

随机推荐

  1. 在html页面中引入另一个html页面

    我们在使用html编写一个网站的时候,通常情况下头部和尾部是相同的,如果一个网站的每个页面都把这些代码写一遍,不仅浪费时间,还显得重复代码很多,所以此时把重复的页面单独摘出来,在用到的时候从外部直接引 ...

  2. Radiobutton基础语法

    .Radiobutton(root 主窗口,text 文本内容,value 值(可以通过set 和 get 获取到的值),variable 变量修改原来的StringVar) self.radio_m ...

  3. PHP ucwords() 函数

    实例 把每个单词的首字符转换为大写: <?php高佣联盟 www.cgewang.comecho ucwords("hello world");?> 定义和用法 ucw ...

  4. CF R630 div2 1332 E Height All the Same

    LINK:Height All the Same 比赛的时候 被这道题给打自闭了 还有1个多小时的时候开始想 想了30min 无果 放弃治疗. 心态炸了 F不想看了 应该要把题目全看一遍的 下次不能这 ...

  5. x86架构:保护模式下加载并运行用户程序

    本章的代码分3个模块: MBR 引导:加载内核core程序 core:包含内核代码段(从磁盘加载用户程序并重定位).内核数据段(存放api名称.临时缓冲.字符串等).API段(供用户程序调用) 用户程 ...

  6. Canal工作原理

    摘自:http://www.importnew.com/25189.html 背景 mysql主备复制实现: 从上层来看,复制分成三步: master将改变记录到二进制日志(binary log)中( ...

  7. react-router-dom中Switch和exact

    路由地址: 内容: / 根 /user  用户 /user/hh 用户笑了 先说exact:(此时没有Switch),给 / 设置exact精确匹配 地址栏: /user/hh 渲染2个组件 : 用户 ...

  8. JavaScript动画实例:圆点的衍生

    考虑如下的曲线方程: R=S*sqrt(n) α=n*θ X=R*SIN(α) Y=R*COS(α) 其中,S和θ可指定某一个定值.对n循环取0~999共1000个值,对于每个n,按照给定的坐标方程, ...

  9. CI4框架应用三 - app目录

    我们再来看一下项目的app目录结构,这个目录就是我们开发的主目录,项目的配置,代码的编写都在这个目录中. Administrator@PC- MINGW64 /c/wamp64/www/ci4/app ...

  10. 【项目实战】sass使用基础篇(上)

    Sass是一种CSS预处理语言.CSS预处理语言是一种新的专门的编程语言,编译后形成正常的css文件,为css增加一些编程特性,无需考虑浏览器的兼容性(完全兼容css3),让css更加简洁.适应性更强 ...