bfs像二叉树的层序遍历

像这个图走bfs就{1, 2, 3, 4, 5, 6, 7, 8}这样走;

dfs就{1, 2, 5, 6, 3, 7, 8, 4}。

bfs与queue相结合,走到哪就把哪加进queue,出时把最先进的那个点弹出,同时把弹出这个点有关连的点加入queue。

例:LuoguP5318 dfs与bfs运用

#include<bits/stdc++.h>
using namespace std;
typedef long long ll;
const int maxn = 1e5 + 5;
ll n, m, k, q, p;
string s, r;
vector<int>a[maxn];//存该点可以走向哪些点,vector第二维可以一直存点
int b[maxn];//用来判断该点有木有经过 void dfs(int x){
if(x >= 1 && x <= n){//经过就输出和标记
b[x] = 1;
cout<<x<<' ';
}
for(int i = 0; i < a[x].size(); i++){
if(!b[a[x][i]])//把没经过的点dfs遍历一遍
dfs(a[x][i]);
}
return;
} void bfs(){
queue<int>q;//队列存点
q.push(1);//点1先进
while(!q.empty()){//判断空否
int p = q.front();
if(b[p] == 0){//队首未经历就输出
b[p] = 1;//标记
cout<<p<<' ';
}
else{//经历过直接弹出到下一次循环
q.pop();
continue;
}
for(int i = 0; i < a[p].size(); i++){
if(!b[a[p][i]])//把点p可以走向的点加入queue
q.push(a[p][i]);
}
q.pop();//不要了弹出
}
} int main(){
//ios_base::sync_with_stdio(0);
//cin.tie(); cout.tie();
cin>>n>>m;
for(int i = 1; i <= m; i++){
cin>>p>>q;
a[p].push_back(q);//点p可以走向q
}
for(int i = 1; i <= n; i++){
sort(a[i].begin(), a[i].end());//依题意从小到大排序,如果大到小自己写个cmp函数
}
dfs(1);//从1开始
memset(b, 0, sizeof(b));//b数组归零用于bfs
cout<<endl;
bfs();
return 0;
}

例:LuoguP3916 反向建边的dfs

#include<bits/stdc++.h>
using namespace std;
typedef long long ll;
const int maxn = 1e5 + 5;
ll n, m, k, q, p;
string s, r;
vector<int>a[maxn];
int b[maxn], c[maxn];//b标记,c存到达最大值 void dfs(int x){
for(int i = 0; i < a[x].size(); i++){//a[x].size()是可以到x点的数
if(b[a[x][i]] == 0){//看看是否标记
b[a[x][i]] = 1;//现在经历了要标记
c[a[x][i]] = c[x];//c[x]是x能到达的最大值,而a[x][i]能到x,所以它到最大值也是x能到最大值
dfs(a[x][i]);//继续深搜可以到a[x][i]的点
}
}
} int main(){
//ios_base::sync_with_stdio(0);
//cin.tie(); cout.tie();
cin>>n>>m;
for(int i = 1; i <= m; i++){
cin>>p>>q;
a[q].push_back(p);//反向建边,a[q]里为能到达q的点
}
for(int i = n; i >= 1; i--){//因为求到达最大,从n倒着循环就行
if(b[i] == 0){//看看是否经历
b[i] = 1;//现在要经历了标记
c[i] = i;//自己到自己最大
dfs(i);//深度搜能到i点的点把他们可以到达最大值设为i
}
}
for(int i = 1; i <= n; i++)
cout<<c[i]<<' ';//输出1到n能到的最大点
return 0;
}

待续…

bfs与dfs基础的更多相关文章

  1. 算法基础:BFS和DFS的直观解释

    算法基础:BFS和DFS的直观解释 https://cuijiahua.com/blog/2018/01/alogrithm_10.html 一.前言 我们首次接触 BFS 和 DFS 时,应该是在数 ...

  2. 算法录 之 BFS和DFS

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

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

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

  4. 简述BFS与DFS

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

  5. 【算法】二叉树、N叉树先序、中序、后序、BFS、DFS遍历的递归和迭代实现记录(Java版)

    本文总结了刷LeetCode过程中,有关树的遍历的相关代码实现,包括了二叉树.N叉树先序.中序.后序.BFS.DFS遍历的递归和迭代实现.这也是解决树的遍历问题的固定套路. 一.二叉树的先序.中序.后 ...

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

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

  7. BFS和DFS详解

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

  8. 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 ...

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

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

随机推荐

  1. 修改 hosts

    不会牛逼操作 -1. 位置.格式 所有系统都差不多,都是 啥啥/etc/hosts 这样的 . 具体去查即可 . 格式: ip + 域名 域名不能含有通配符 hosts 可以绕过 dns 解析,直接访 ...

  2. Axure RP 8 实现 圆角文本框 圆角带筛选的下拉列表框 可自动显示滚动条

    刚开始用Axure 会发现 Axure 元件库并不是很齐全,很多元件需要自己想办法解决 或者去网上去找.其实个人建议网上有现成的元件可以就下载就不必花时间去折腾.除非你也想练练手,原型这种东西除非高保 ...

  3. 如何开发一款基于 vite+vue3 的在线表格系统(下)

    在上篇内容中我们为大家分享了详细介绍Vue3和Vite的相关内容.在本篇中我们将从项目实战出发带大家了解Vite+Vue3 的在线表格系统的构建. 使用Vite初始化Vue3项目 在这里需要注意:根据 ...

  4. Excel 运算符(三):文本连接符

    文本连接符&用来合并文本串.比如,连接"计算机"和"基础"两个文本串:"计算机基础"&"基础",最终结果 ...

  5. LOJ#2014「SCOI2016」萌萌哒(倍增,并查集优化连边)

    题面 点此看题 题意很明白,就不转述了吧. 题解 题目相当于告诉了我们若干等量关系,每个限制 l 1 , r 1 , l 2 , r 2 \tt l_1,r_1,l_2,r_2 l1​,r1​,l2​ ...

  6. Seatunnel超高性能分布式数据集成平台使用体会

    @ 目录 概述 定义 使用场景 特点 工作流程 连接器 转换 为何选择SeaTunnel 安装 下载 配置文件 部署模式 入门示例 启动脚本 配置文件使用参数示例 Kafka进Kafka出的ETL示例 ...

  7. 1.6_HTML基础属性

    name 属性 name 属性用于指定标签元素的名称. <a> 标签内必须提供 href 或 name 属性. <a name="value"> id 属性 ...

  8. 踩坑 Windows 服务来宿主 .NET 程序

    本文所指的 .NET 程序为 .NET6 的程序.因为 .NET 的版本更新很快,所以方式.方法也有变化,所以网上搜到的方法有些也过时了.以下是最近我实践下来的一点心得(坑). 上一篇说到 不安装运行 ...

  9. HiveSql调优系列之Hive严格模式,如何合理使用Hive严格模式

    目录 综述 1.严格模式 1.1 参数设置 1.2 查看参数 1.3 严格模式限制内容及对应参数设置 2.实际操作 2.1 分区表查询时必须指定分区 2.2 order by必须指定limit 2.3 ...

  10. KingbaseESV8R6 垃圾回收原理以及如何预防膨胀

    背景 KingbaseESV8R6支持snapshot too old 那么实际工作中,经常看到表又膨胀了,那么我们讨论一下导致对象膨胀的常见原因有哪些呢? 未开启autovacuum 对于未开启au ...