简述BFS与DFS

简述BFS与DFS

最近学习了数据结构课程以及应对蓝桥杯备考,所以花费了一点时间将比较重要的两个搜索BFS(宽度优先搜索)和DFS(深度优先搜索)大致思路以及代码整理出来,如有错误,还请各位大佬批评改正。

PS:用了几天时间试探着做了一个简单的静态网页,包括购买服务器,建站,以及代码编写,过几天我会给出具体流程。大牛勿喷 网站地址*/

##所谓搜索,实质就是遍历,只是在处理不同问题时加一些限制条件而已,比如走迷宫,则需要从出发点开始,向终点不断试探,当到达终点,则break提前结束遍历。
在这里推荐浙江大学PAT中计算图的连通集这道题,非常基础,下面我会给出题解。链接:浙大PAT连通集

DFS(深度优先搜索)

所谓深度,就类似树的先序遍历,形象的说就是一条路走到黑,如果走到头了,则返回上一个节点,所以我们很自然会想到用递归实现,另外加一个标记数组,确保节点只访问一次。(这里建议邻接矩阵跟标记数组全部使用全局变量,不然的话函数传参会很麻烦)

void dfs(int now)
{
	cout << now << " ";
	book[now] = 1;
	for (int t = 0; t < point; t++)
	{
		if (shang[now][t] == 1 && book[t] == 0)
			dfs(t);
	}
	return;
}

 

上述为DFS函数,每次递归后都会找到与之相邻的节点,并再次递归,直到所有节点全部遍历一次。

BFS(广度优先搜索)

所谓广度优先就类似树里面的层序遍历,每次访问的是同层的节点,同层访问后再继续向下访问,这里我们用队列来实现,利用队列的先进先出性质,每次递增访问,这样通过广度优先,我们可以得到迷宫的最短路径。

void bfs(int now)
{
	struct quee q;
	book[now] = 1;
	q.number[q.top] = now;
	q.top++;
	//cout << endl<<endl<<endl<< q.tail << " " << q.top;
	while (q.tail != q.top) {
		now = q.number[q.tail];
		q.tail++;
		cout << now << " ";
		for (int t2 = 0; t2 < point; t2++)
		{
			if (shang[now][t2] == 1 && book[t2] == 0)
			{
				q.number[q.top] = t2;
				q.top++;
				book[t2] = 1;
			}
		}
	}

}

 

浙大PAT列出所有连通集:
06-图1 列出连通集 (25分)
给定一个有N个顶点和E条边的无向图,请用DFS和BFS分别列出其所有的连通集。假设顶点从0到N−1编号。进行搜索时,假设我们总是从编号最小的顶点出发,按编号递增的顺序访问邻接点。

输入格式:
输入第1行给出2个整数N(0<N≤10)和E,分别是图的顶点数和边数。随后E行,每行给出一条边的两个端点。每行中的数字之间用1空格分隔。

输出格式:
按照{v1,v2,V3…}的格式,每行输出一个连通集。先输出DFS的结果,再输出BFS的结果。
输入样例:
8 6
0 7
0 1
2 0
4 1
2 4
3 5
输出样例:
{ 0 1 4 2 7 }
{ 3 5 }
{ 6 }
{ 0 1 2 7 4 }
{ 3 5 }
{ 6 }
看到题目就会觉得很基础,只是单纯的考一下BFS和DFS,用一个邻接矩阵将图的关系存入,然后分别调用两个函数,再按照样例格式输出即可
AC代码

#include<iostream>
using namespace std;
int point, leg;
int shang[1005][1005] = { 0 };
int book[1005] = { 0 };
struct quee
{
	int top=0, tail=0;
	int number[1005];
};
void dfs(int now)
{
	cout << now << " ";
	book[now] = 1;
	for (int t = 0; t < point; t++)
	{
		if (shang[now][t] == 1 && book[t] == 0)
			dfs(t);
	}
	return;
}
void bfs(int now)
{
	struct quee q;
	book[now] = 1;
	q.number[q.top] = now;
	q.top++;
	//cout << endl<<endl<<endl<< q.tail << " " << q.top;
	while (q.tail != q.top) {
		now = q.number[q.tail];
		q.tail++;
		cout << now << " ";
		for (int t2 = 0; t2 < point; t2++)
		{
			if (shang[now][t2] == 1 && book[t2] == 0)
			{
				q.number[q.top] = t2;
				q.top++;
				book[t2] = 1;

			}
		}
	}

}
int main()
{
	int L1, L2;
	cin >> point >> leg;
	for (int t = 0; t < leg; t++) {
		cin >> L1 >> L2;
		shang[L1][L2] = 1;
		shang[L2][L1] = 1;
	}
	for (int t3 = 0; t3 < point; t3++)
	{
		if (book[t3] == 0) {
			cout << "{ ";
			dfs(t3);
			cout << "}";
			cout << endl;
		}
		
	}
	for (int t3 = 0; t3 < point; t3++)
		book[t3] = 0;
	for (int t3 = 0; t3 < point; t3++)
	{
		if (book[t3] == 0) {
			cout << "{ ";
			bfs(t3);
			cout << "}";
			cout << endl;
		}

	}
}

posted on 2020-08-15 12:11  AIERSTOM  阅读(319)  评论(0编辑  收藏  举报

导航