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的迷宫.迷宫由通道和墙壁组成,每一步可以向相邻的上下左右四格的通道移动.请求出从起点到终点所需的最小步数.如果不能到 ...
随机推荐
- python subprocess相关操作
python subprocess常用操作 1.subprocess模块的常用函数 函数 描述 subprocess.run() Python 3.5中新增的函数.执行指定的命令,等待命令执行完成后返 ...
- MYSQL(基本篇)——一篇文章带你走进MYSQL的奇妙世界
MYSQL(基本篇)--一篇文章带你走进MYSQL的奇妙世界 MYSQL算是我们程序员必不可少的一份求职工具了 无论在什么岗位,我们都可以看到应聘要求上所书写的"精通MYSQL等数据库及优化 ...
- linux 邮件
通过命令行发送邮件 [root@ProxyServer ~]# mail -s "test" justin@51cto.com dfdafd dfadf fadf EOT [roo ...
- 使用Mpvue配合Weui开发面试题题库微信小程序,并且发布到正式环境
原文转载自「刘悦的技术博客」https://v3u.cn/a_id_116 之前的一篇文章详细阐述了微信小程序开发的准备和入门以及环境搭建,这一次我们介绍如何将微信小程序如何上线,同时配合weui美化 ...
- 承上启下继往开来,Python3上下文管理器(ContextManagers)与With关键字的迷思
原文转载自「刘悦的技术博客」https://v3u.cn/a_id_217 在开发过程中,我们会经常面临的一个常见问题是如何正确管理外部资源,比如数据库.锁或者网络连接.稍不留意,程序将永久保留这些资 ...
- 【点击云游台湾省】今天,老子云在台湾省建了个3D房子!
今日热搜仍然聚焦台湾省,中国新闻网发文:地图已经可以显示台湾省的每个街道.网友一片叫好! 台湾省通过平面图观察,难免看的不够真切,其实现在已经可以通过3D视角云游台湾省了! 老子云这次通过自研技术,还 ...
- JVM内存模型和结构详解(五大模型图解)
JVM内存模型和Java内存模型都是面试的热点问题,名字看感觉都差不多,实际上他们之间差别还是挺大的. 通俗点说,JVM内存结构是与JVM的内部存储结构相关,而Java内存模型是与多线程编程相关@mi ...
- Git 06 分支
参考源 https://www.bilibili.com/video/BV1FE411P7B3?spm_id_from=333.999.0.0 版本 本文章基于 Git 2.35.1.2 概述 分支用 ...
- mustache.js常见用法
一.mustache基于JS模板引擎,能较为快捷和简单得实现数据得渲染 用法: 1.CDN引入mustache.js,以下是4.0.1版本,有需要可以去github上查询其他版本的代码. (funct ...
- spring接口多实现类,该依赖注入哪一个?
一.问题的描述 在实际的系统应用开发中我经常会遇到这样的一类需求,相信大家在工作中也会经常遇到: 同一个系统在多个省份部署. 一个业务在北京是一种实现方式,是基于北京用户的需求. 同样的业务在上海是另 ...