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的迷宫.迷宫由通道和墙壁组成,每一步可以向相邻的上下左右四格的通道移动.请求出从起点到终点所需的最小步数.如果不能到 ...
随机推荐
- AtCoder Beginner Contest 247 F - Cards // dp + 并查集
原题链接:F - Cards (atcoder.jp) 题意: 给定N张牌,每张牌正反面各有一个数,所有牌的正面.反面分别构成大小为N的排列P,Q. 求有多少种摆放方式,使得N张牌朝上的数字构成一个1 ...
- 自定义bean对象实现序列化接口
上一个word count的案例中,我们为了理解mapreduce的流程,写了上面的代码.现在我们要把一个实体类序列化.比如现在有这么一个文件,里面的数据格式是这样的: 第一列是时间戳,第二列是手机号 ...
- YII学习总结2(命名空间和操作响应)
YII基础准备1.命名空间<?php /****假设有三个同名的类,输出的值为A,B,C****/ use a\b\c\apple; use d\e\f\apple as bApple; use ...
- Win10环境下使用Flask配合Celery异步推送实时/定时消息(Socket.io)/2020年最新攻略
原文转载自「刘悦的技术博客」https://v3u.cn/a_id_163 首先得明确一点,和Django一样,在2020年Flask 1.1.1以后的版本都不需要所谓的三方库支持,即Flask-Ce ...
- 青山不遮,毕竟东流,集成Web3.0身份钱包MetaMask以太坊一键登录(Tornado6+Vue.js3)
原文转载自「刘悦的技术博客」https://v3u.cn/a_id_213 上世纪九十年代,海湾战争的时候,一位美军军官担心他们的五角大楼会被敌人的一枚导弹干掉,从而导致在全球的美军基地处于瘫痪状态. ...
- Python 支付宝红包二维码制作步骤分享
本文所有教程及源码.软件仅为技术研究.不涉及计算机信息系统功能的删除.修改.增加.干扰,更不会影响计算机信息系统的正常运行.不得将代码用于非法用途,如侵立删! 支付宝红包二维码制作步骤分享 2022. ...
- Python 爬取汽车之家口碑数据
本文仅供学习交流使用,如侵立删!联系方式见文末 汽车之家口碑数据 2021.8.3 更新 增加用户信息参数.认证车辆信息等 2021.3.24 更新 更新最新数据接口 2020.12.25 更新 添加 ...
- Java开发学习(二十三)----SpringMVC入门案例、工作流程解析及设置bean加载控制
一.SpringMVC概述 SpringMVC是隶属于Spring框架的一部分,主要是用来进行Web开发,是对Servlet进行了封装.SpringMVC是处于Web层的框架,所以其主要的作用就是用来 ...
- 红黑树以及JAVA实现(一)
目录 前言 一. B树 1.1 概念 1.2 2-3-4树 1.3 2-3-4树的插入 节点分类 1.4 2-3-4树的删除 1.4.1 当删除节点是叶子节点 1.4.1.1 当删除节点为非2节点 1 ...
- 【建议收藏】Mac VMWare NAT模式安装 CentOS 7-操作教程
学习大数据离不开 Linux 系统,网络上大部分文章都是在 Windows 系统下使用 VMWare Workstation 安装 CentOS ,并使用 NAT 模式配置网络.本文基于 Mac OS ...