简述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. Python os.tmpfile() 方法

    概述 os.tmpfile() 方法用于返回一个打开的模式为(w+b)的临时文件对象,这文件对象没有文件夹入口,没有文件描述符,将会自动删除.高佣联盟 www.cgewang.com 语法 tmpfi ...

  2. Composer 安装与使用

    Composer 安装与使用 分类 编程技术高佣联盟 www.cgewang.com Composer 是 PHP 的一个依赖管理工具.我们可以在项目中声明所依赖的外部工具库,Composer 会帮你 ...

  3. luogu P3285 [SCOI2014]方伯伯的OJ splay 线段树

    LINK:方伯伯的OJ 一道稍有质量的线段树题目.不写LCT splay这辈子是不会单独写的 真的! 喜闻乐见的是 题目迷惑选手 \(op==1\) 查改用户在序列中的位置 题目压根没说位置啊 只有排 ...

  4. 2020牛客暑假多校训练营 第二场 G Greater and Greater bitset

    LINK:Greater and Greater 确实没能想到做法. 考虑利用bitset解决问题. 做法是:逐位判断每一位是否合法 第一位 就是 bitset上所有大于\(b_1\)的位置 置为1. ...

  5. C#与网络相关的两个监听的事件

    今天遇到一个问题,当网络连接有问题的时候设计软件向用户发送通知,查了资料发现了两个相关的事件分享一下. 一.System.Net.NetworkInformation命名空间下的NetworkChan ...

  6. 配置Django-TinyMCE组件支持上传图片功能

    Django自带的Admin后台,好用,TinyMCE作为富文本编辑器,也蛮好用的,这两者结合起来在做博客的时候很方便(当然博客可能更适合用Markdown来写),但是Django-TinyMCE这个 ...

  7. 蜻蜓点水说说Redis的ziplist的奥秘

    本篇博客参考: Redis 深度历险:核心原理与应用实践 Redis内部数据结构详解(4)--ziplist Redis的压缩列表ZipList 上篇博客中,我给大家蜻蜓点水般的介绍了Redis中SD ...

  8. C++ 的字符串反转

    C++ 的字符串反转 方法一: 使用 algorithm 中的 reverse 函数: // reverse 函数的定义(在 std 名称空间中) template<class BidirIt& ...

  9. C++/C socket编程

    目录 socket()函数 何为socket Internet套接字 流格式套接字SOCK_STREAM 数据报格式套接字SOCK_DGRAM TCP/IP协议族 创建套接字 加载套接字库 Windo ...

  10. 从系统报表页面导出20w条数据到本地只用了4秒,我是如何做到的

    背景 最近有个学弟找到我,跟我描述了以下场景: 他们公司内部管理系统上有很多报表,报表数据都有分页显示,浏览的时候速度还可以.但是每个报表在导出时间窗口稍微大一点的数据时,就异常缓慢,有时候多人一起导 ...