一题学习BFS和DFS算法
洛谷题目解析:【深基18.例3】查找文献
题目背景
小K热衷于在洛谷博客上阅读文章并探索其中的知识。每篇文章都可能包含指向其他博客文章的参考文献链接。小K的求知欲非常强,如果他阅读了某篇文章,他一定会去查看这篇文章的所有参考文献(但前提是这些参考文献他之前还没看过)。现在,我们帮助小K设计一种方法,确保他能不重复、不遗漏地阅读完所有他能看到的文章。
题目描述
洛谷博客共有n(n≤105)篇文章(编号为1到n)和m(m≤106)条参考文献引用关系。小K已经打开了编号为1的文章。我们需要通过深度优先搜索(DFS)和广度优先搜索(BFS)两种方式,来模拟小K阅读文章的过程,并输出遍历的结果。
输入输出格式
输入格式:
- 第一行包含两个整数n和m,分别表示文章总数和参考文献关系数。
- 接下来m行,每行包含两个整数X,Y,表示文章X有参考文献Y。
输出格式:
- 第一行输出DFS遍历的结果。
- 第二行输出BFS遍历的结果。
样例
样例输入:
8 9
1 2
1 3
1 4
2 5
2 6
3 7
4 7
4 8
7 8
样例输出:
1 2 5 6 3 7 8 4
1 2 3 4 5 6 7 8
解题思路
深度优先搜索(DFS)
DFS是一种用于遍历或搜索树或图的算法。它从根节点开始,尽可能深地搜索树的分支,直到达到叶子节点,然后回溯到前一个节点,继续探索尚未探索的分支。在DFS中,我们使用递归来实现这一过程。
广度优先搜索(BFS)
BFS也是一种遍历或搜索图或树的算法。它从根节点开始,首先访问根节点的所有相邻节点,然后对每个相邻节点,再访问它们的所有未被访问的相邻节点,以此类推,直到所有节点都被访问。在BFS中,我们通常使用队列来实现这一过程。
代码实现
以下是C++的实现代码,包含了DFS和BFS的具体实现:
#include<iostream>
#include<vector>
#include<queue>
#include<algorithm>
using namespace std;
const int MAXN = 100010;