bfs与dfs基础
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基础的更多相关文章
- 算法基础:BFS和DFS的直观解释
算法基础:BFS和DFS的直观解释 https://cuijiahua.com/blog/2018/01/alogrithm_10.html 一.前言 我们首次接触 BFS 和 DFS 时,应该是在数 ...
- 算法录 之 BFS和DFS
说一下BFS和DFS,这是个比较重要的概念,是很多很多算法的基础. 不过在说这个之前需要先说一下图和树,当然这里的图不是自拍的图片了,树也不是能结苹果的树了.这里要说的是图论和数学里面的概念. 以上概 ...
- 【数据结构与算法】自己动手实现图的BFS和DFS(附完整源码)
转载请注明出处:http://blog.csdn.net/ns_code/article/details/19617187 图的存储结构 本文的重点在于图的深度优先搜索(DFS)和广度优先搜索(BFS ...
- 简述BFS与DFS
简述BFS与DFS 最近学习了数据结构课程以及应对蓝桥杯备考,所以花费了一点时间将比较重要的两个搜索BFS(宽度优先搜索)和DFS(深度优先搜索)大致思路以及代码整理出来,如有错误,还请各位大佬批评改 ...
- 【算法】二叉树、N叉树先序、中序、后序、BFS、DFS遍历的递归和迭代实现记录(Java版)
本文总结了刷LeetCode过程中,有关树的遍历的相关代码实现,包括了二叉树.N叉树先序.中序.后序.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!>文章中说到面试官问 ...
- 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的迷宫.迷宫由通道和墙壁组成,每一步可以向相邻的上下左右四格的通道移动.请求出从起点到终点所需的最小步数.如果不能到 ...
随机推荐
- 出现 Expected 0 arguments but found 1 的bug原因
问题:在给FileInputStream传入参数时报错 原以为是导错了包,结果试了几次都不行,最后才发现是项目名和这个方法名重复了,修改项目名就可以了! 红线出只是异常,抛出即可解决
- SkyWalking分布式系统应用程序性能监控工具-中
其他功能 性能剖析 在系统性能监控方法上,Skywalking 提出了代码级性能剖析这种在线诊断方法.这种方法基于一个高级语言编程模型共性,即使再复杂的系统,再复杂的业务逻辑,都是基于线程去进行执行的 ...
- Python 元类详解
一.Type介绍 在Python中一切皆对象,类它也是对象,而元类其实就是用来创建类的对象(由于一切皆对象,所以元类其实也是一个对象). 先来看这几个例子: 例1: In [1]: type(12) ...
- PHP几个工具函数
移除XSS攻击脚本 function RemoveXSS($val) { // remove all non-printable characters. CR(0a) and LF(0b) and T ...
- 用 Scanner 扫描CSV文件时报错:“java.util.nosuchelementexception:no line found”的解决方法
最近用 java 对一个很大的 CSV 文件进行处理.打算用 Scanner 逐行扫描进来,结果报错 "java.util.nosuchelementexception:no line fo ...
- Redis 15 主从复制
参考源 https://www.bilibili.com/video/BV1S54y1R7SB?spm_id_from=333.999.0.0 版本 本文章基于 Redis 6.2.6 概述 主从复制 ...
- 谈谈你对Promise的理解
一.Promise是什么? 理解 抽象表达: Promise 是一门新的技术(ES6 规范) Promise 是 JS 中进行异步编程的新解决方案(备注:旧方案是单纯使用回调函数) 具体表达: 从语法 ...
- 简单理解 Flutter 中 StatelessWidget 和 StatefulWidget
Widget 分为了两种类型,分别为 StatelessWidget 和 StatefulWidget. 顾名思义,StatelessWidget 就是无状态的组件,它只是作为一个不发生任何更新状态的 ...
- MapReduce计算流程
MapReduce的计算流程 1.1 原始数据File The books chronicle the adventures of the adolescent wizard Harry Potter ...
- 「题解报告」Blocks
P3503 Blocks 题解 原题传送门 思路 首先我们可以发现,若 \(a_l\) ~ \(a_r\) 的平均值大于等于 \(k\) ,则这个区间一定可以转化为都大于等于 \(k\) 的.我们就把 ...