简述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. 老男孩武老师的Django笔记

    武老师的 Django 博客笔记 基础篇 https://www.cnblogs.com/wupeiqi/articles/5237704.html 进阶篇 https://www.cnblogs.c ...

  2. Seaborn实现多变量分析

    import seaborn as sns import numpy as np import pandas as pd import matplotlib.pyplot as plt sns.set ...

  3. 6-Pandas之缺失值处理

    一.了解缺失值 通常使用 NA('not available')来代指缺失值 在Pandas的数据结构中,缺失值使用 NaN('Not a Number')进行标识 除了汇总统计方法,还可以使用isn ...

  4. Python Tuple(元组) len()方法

    描述 Python 元组 len() 函数计算元组元素个数.高佣联盟 www.cgewang.com 语法 len()方法语法: len(tuple) 参数 tuple -- 要计算的元组. 返回值 ...

  5. PHP debug_zval_dump() 函数

    debug_zval_dump 函数用于查看一个变量在zend引擎中的引用计数.类型信息. 版本要求:PHP 4 >= 4.2.0, PHP 5, PHP 7高佣联盟 www.cgewang.c ...

  6. PHP lcg_value() 函数

    实例 返回范围为 (0, 1) 的一个伪随机数: <?phpecho lcg_value();?>高佣联盟 www.cgewang.com 定义和用法 lcg_value() 函数返回范围 ...

  7. EACCES: permission denied,mkdir … npm install 安装依赖问题解决

    强哥最近在用hugeGraph图库做二次开发的时候,在打包的时遇到前端项目打包失败的问题: cwebp-bin@4.0.0 postinstall /home/hugegraph/my-hugegra ...

  8. demo1 动态显示view或弹框 动态隐藏view或弹框

    实现界面如上所示: 有一个弹框,弹框上边有一个关闭按钮,点击按钮,可以关闭弹框.点击弹框的周围区域也可以关闭按钮. 点击上边的隐藏弹框也可以关闭按钮. 在实现功能的基础上,以动画的形式展示跟隐藏. 思 ...

  9. Nginx实现静态服务器+https+负载均衡

    #user nobody; # 进程数=CPU总核数 worker_processes 2; #error_log logs/error.log; #error_log logs/error.log ...

  10. 5、抽象工厂 abstract factory 将关联组件组成产品 创建型模式

    趁热打铁,紧跟着上一节的工厂方法模式.这一节介绍一下抽象工厂模式,以及分析俩个模式的不同 1.何为抽象模式? 抽象工厂模式(Abstract Factory Pattern)是围绕一个超级工厂创建其他 ...