-
概念:
DFS:
深度优先搜索是一种在开发爬虫早期使用较多的方法。它的目的是要达到被搜索结构的叶结点(即那些不包含任何超链的HTML文件) 。在一个HTML文件中,当一个超链被选择后,被链接的HTML文件将执行深度优先搜索,即在搜索其余的超链结果之前必须先完整地搜索单独的一条链。深度优先搜索沿着HTML文件上的超链走到不能再深入为止,然后返回到某一个HTML文件,再继续选择该HTML文件中的其他超链。当不再有其他超链可选择时,说明搜索已经结束。BFS:
宽度优先搜索算法(又称广度优先搜索)是最简便的图的搜索算法之一,这一算法也是很多重要的图的算法的原型。Dijkstra单源最短路径算法和Prim最小生成树算法都采用了和宽度优先搜索类似的思想。属于一种盲目搜寻法,目的是系统地展开并检查图中的所有节点,以找寻结果。换句话说,它并不考虑结果的可能位置,彻底地搜索整张图,直到找到结果为止。 -
思路
DFS:从一个顶点V0开始,沿着一条路一直走到底,如果发现不能到达目标解,那就回溯到上一个节点,然后从另一条路开始走到底。
-
对比
深度优先搜索用栈(stack)来实现,整个过程可以想象成一个倒立的树形:
1、把根节点压入栈中。
2、每次从栈中弹出一个元素,搜索所有在它下一级的元素,把这些元素压入 栈中。并把这个元素记为它下一级元素的前驱。
3、找到所要找的元素时结束程序。
4、如果遍历整个树还没有找到,结束程序。
广度优先搜索使用队列(queue)来实现,整个过程也可以看做一个倒立的树形:
1、把根节点放到队列的末尾。
2、每次从队列的头部取出一个元素,查看这个元素所有的下一级元素,把它 们放到队列的末尾。并把这个元素记为它下一级元素的前驱。
3、找到所要找的元素时结束程序。
4、如果遍历整个树还没有找到,结束程序。 -
例题:
4.1DFS:图的按录入顺序深度优先搜索(1068)
题目描述:
图的深度优先搜索类似于树的先根遍历,即从某个结点开始,先访问该结点,然后深度访问该结点的第一棵子树,依次为第二顶子树。如此进行下去,直到所有的结点都访问为止。在该题中,假定所有的结点以“A”至“Z”中的若干字符表示,且要求结点的访问顺序根据录入的顺序进行访问。如果结点录入的顺序为HUEAK,从H开始进行深度优先搜索,则可能的搜索结果为:H->A->K->U>E.
输入
第一行为一个整数n,表示顶点的个数,第二行为n个大写字母构成的字符串,表示顶点,接下来是为一个n*n大小的整数矩阵,表示图的邻接关系。数字为0表示不邻接,否则为相应的边的长度。最后一行为一个字符,表示要求进行深度优先搜索的起始顶点。
输出
用一行输出深度优先搜索结果,起始点为给定的顶点。
样例输入
5
HUEAK
0 0 2 3 0
0 0 0 7 4
2 0 0 0 0
3 7 0 0 1
0 4 0 1 0
H
样例输出
HEAUK
#include<iostream>
#include<string.h>
using namespace std;
int n;
int num[100][100], flag[20] = { 0 };
char ch[50];
void DFS(int y)
{
int i;
cout << ch[y];
flag[y] = 1;
for (i = 0; i < n; i++) {
if (flag[i] == 0 && num[y][i] != 0) {
DFS(i);
}
}
}
int main()
{
cin >> n;
int i, j;
char m;
for (i = 0; i < n; i++) {
cin >> ch[i];
}
for (i = 0; i < n; i++) {
for (j = 0; j < n; j++) {
cin >> num[i][j];
}
}
cin >> m;
for (i = 0; i < n; i++) {
if (ch[i] == m) {
DFS(i);
}
}
}
4.2 BFS:图的按录入顺序广度优先搜索(1069)
题目描述:
图的广度优先搜索类似于树的按层次遍历,即从某个结点开始,先访问该结点,然后访问该结点的所有邻接点,再依次访问各邻接点的邻接点。如此进行下去,直到所有的结点都访问为止。在该题中,假定所有的结点以“A”–“Z”中的若干字符表示,且要求点的访问顺序根据录入的顺序进行访问。如果结点录入的顺序为HUEAK,要求从H开始进行广度优先搜索,则可能的搜索结果为:H->E->A->U->K.
输入
第一行为一个整数n,表示顶点的个数,第二行为n个大写字母构成的字符串,表示顶点,
接下来是为一个n*n大小的整数矩阵,表示图的邻接关系。数字为0表示不邻接,否则为相
应的边的长度。最后一行为一个字符,表示要求进行广度优先搜索的起始顶点。
输出
用一行输出广度优先搜索结果,起始点为给定的顶点。
样例输入
5
HUEAK
0 0 2 3 0
0 0 0 7 4
2 0 0 0 0
3 7 0 0 1
0 4 0 1 0
H
样例输出
HEAUK
代码
#include<iostream>
using namespace std;
int n;
int num[100][100], flag[20] = { 0 },tou=0,wei=0,dui[100];
char ch[50];
void BFS(int y)
{
int i;
dui[wei] = y;
wei++;
cout << ch[y];
flag[y] = 1;
while (tou != wei) {
for (i = 0; i < n; i++) {
if (flag[i] == 0 && num[dui[tou]][i] != 0) {
cout << ch[i];
flag[i] = 1;
dui[wei] = i;
wei++;
}
}
tou++;
}
}
int main()
{
cin >> n;
int i, j;
char m;
for (i = 0; i < n; i++) {
cin >> ch[i];
}
for (i = 0; i < n; i++) {
for (j = 0; j < n; j++) {
cin >> num[i][j];
}
}
cin >> m;
for (i = 0; i < n; i++) {
if (ch[i] == m) {
BFS(i);
}
}
return 0;
}