简述BFS与DFS
简述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的更多相关文章
- HDU-4607 Park Visit bfs | DP | dfs
题目链接:http://acm.hdu.edu.cn/showproblem.php?pid=4607 首先考虑找一条最长链长度k,如果m<=k+1,那么答案就是m.如果m>k+1,那么最 ...
- BFS和DFS详解
BFS和DFS详解以及java实现 前言 图在算法世界中的重要地位是不言而喻的,曾经看到一篇Google的工程师写的一篇<Get that job at Google!>文章中说到面试官问 ...
- 算法录 之 BFS和DFS
说一下BFS和DFS,这是个比较重要的概念,是很多很多算法的基础. 不过在说这个之前需要先说一下图和树,当然这里的图不是自拍的图片了,树也不是能结苹果的树了.这里要说的是图论和数学里面的概念. 以上概 ...
- 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 ...
- 算法学习之BFS、DFS入门
算法学习之BFS.DFS入门 0x1 问题描述 迷宫的最短路径 给定一个大小为N*M的迷宫.迷宫由通道和墙壁组成,每一步可以向相邻的上下左右四格的通道移动.请求出从起点到终点所需的最小步数.如果不能到 ...
- 【数据结构与算法】自己动手实现图的BFS和DFS(附完整源码)
转载请注明出处:http://blog.csdn.net/ns_code/article/details/19617187 图的存储结构 本文的重点在于图的深度优先搜索(DFS)和广度优先搜索(BFS ...
- ACM__搜素之BFS与DFS
BFS(Breadth_First_Search) DFS(Depth_First_Search) 拿图来说 BFS过程,以1为根节点,1与2,3相连,找到了2,3,继续搜2,2与4,相连,找到了4, ...
- BFS和DFS算法
昨晚刚昨晚华为笔试题,用到了BFS和DFS,可惜自己学艺不精,忘记了实现原理,现在借用大佬写的内容给自己做个提高 转自:https://www.jianshu.com/p/70952b51f0c8 图 ...
- 通俗理解BFS和DFS,附基本模板
1.BFS(宽度优先搜索):使用队列来保存未被检测的节点,按照宽度优先的顺序被访问和进出队列 打个比方:(1)类似于树的按层次遍历 (2)你的眼镜掉在了地上,你趴在地上,你总是先摸离你最近的地方,如果 ...
随机推荐
- PHP settype() 函数
settype() 函数用于设置变量的类型.高佣联盟 www.cgewang.com PHP 版本要求: PHP 4, PHP 5, PHP 7 语法 bool settype ( mixed &am ...
- Skill 脚本演示 ycNetToPin.il
https://www.cnblogs.com/yeungchie/ ycNetToPin.il 通过选中一个 instance ,分析与其连接且同时选中的 wire 上含有的 netName ,自动 ...
- 牛客练习赛63 牛牛的树行棋 差分 树上博弈 sg函数
LINK:牛牛的树行棋 本来是不打算写题解的. 不过具体思考 还是有一段时间的. 看完题 一直想转换到阶梯NIM的模型上 转换失败. 考虑SG函数. 容易发现 SG函数\(sg_x=max{sg_{t ...
- 10分钟了解js的宏任务和微任务
熟悉宏任务和微任务以及js(nodejs)事件循环机制,在写业务代码还是自己写库,或者看源码都是那么重要 看了部分文档,自己总结和实践了一下 js中同步任务.宏任务和微任务介绍 同步任务: 普通任务 ...
- linux的存储管理(RALD) LVM 逻辑卷管理 虚拟阵列
磁盘存储管理 LVM 逻辑卷 虚拟阵列 1.Linux系统中 磁盘使用 存在3个大问题: 1.灵活性 2.安全性 3.性能 2.解决办法RAID独立磁盘冗余阵列 RAID(Redundant Arra ...
- Dockerfile你值得拥有
Dockerfile 介绍 什么是Dockerfile Dockerfile是一个用来将你的应用构建为docker镜像的文本文件,文本中的内容是一条一条的指令,这些指令的集合在docker引擎中执行, ...
- 授人以渔:stm32资料查询技巧
摘要:本章以stm32f103作为案例向大家讲解arm公司和st公司的关系以及我们在对stm32开发时需要如何正确的查找手册. ARM公司和ST公司的关系 这里要从一块芯片的生产说起,比如我们要生成一 ...
- Python 5 行代码的神奇操作
Python 语言实现功能直接了当,简明扼要,今天咱们就来一起看看 Python 5 行代码的神奇操作! 1.古典兔子问题 很多人学习python,不知道从何学起.很多人学习python,掌握了基本语 ...
- Java基础—封装
封装是面向对象的核心特征之一,它提供了一种信息隐藏技术.类的包装包含两层含义:一是将数据和对数据的操作组合起来构成类,类是一个不可分割的独立单位:二是类中既要提供与外部联系的接口,又要尽可能隐藏类的实 ...
- 【JavaScript】windows.open用法详解
windows.open("URL","窗口名称","窗口外观设定");的用法详解 function onNewWindows(redire ...