对于树而言,深搜指的是前序、中序、后序遍历;广搜指的是利用队列实现的层序遍历;
对于图而言,深搜一般指针对于邻接矩阵或者邻接表的深搜,广搜是针对于邻接矩阵或者邻接表的层序遍历;
以下代码实现邻接矩阵的深搜和广搜:
//图
#include<iostream>
#include<vector>
#include<cstdio>
using namespace std;
//深搜--邻接矩阵实现
int dfs(int cur,int count,int n, vector<vector<int>> vexarray,vector<int> vex) {
int i;
cout << cur << '\t';
count = count+1;
if (count == n) return;
for (int i = 1; i <= n;i++) {
if (vexarray[cur][i] == i && vex[i] == 0) {
vex[i] = 1;
dfs(i, count, n, vexarray, vex);
}
}
return 0;
}
//广搜 -- 邻接矩阵实现
void BFS(int n, vector<vector<int>> vexarray, vector<int> vex) {
queue<int> q; //定义辅助队列
for (int i = 1; i <= n;i++) { //对每一个顶点做循环
if (vex[i] == 0) { //表示这个顶点没有被访问过
vex[i] = 1;
cout << i << '\t';
q.push(i);
while (!q.empty()) { //当队列不空时
int tmp = q.front(); //将队头元素赋值给tmp
q.pop();
for (int j = 1; j <= n; j++) { //每次循环遍历一行
if (vexarray[tmp][j] == 1 && vex[j] == 0) {
vex[j] = 1;
cout << j << '\t';
q.push(j);
}
}
}
}
}
}
int main() {
int a, b, m, n, i, j;
int count = 0; //记录节点数
//初始化二维矩阵
cout << "输入顶点数:" << endl;
cin >> n;
cout << endl;
cout << "输入边的数量:" << endl;
cin >> m;
vector<vector<int>> vexarray(n + 1, vector<int>(n + 1)); //定义二维矩阵
vector<int> vex(m + 1,0); //定义顶点表
for (int i = 1; i <= n; i++) {
for (int j = 1; j <= n;j++ ) {
if (i == j) vexarray[i][j] == 0;
else vexarray[i][j] = 0x3f;
}
}
//读入顶点之间的边
for (int i = 1; i <= n; i++) {
cout << "输入边的两个顶点:" << endl;
cin >> a >> b;
vexarray[a][b] = 1;
vexarray[b][a] = 1; //无向图
}
//从顶点1出发深度优先遍历
vex[1] = 1; //标识已经被访问
dfs(1,count,n, vexarray, vex); //从顶点1开始遍历
//从顶点出发广度优先遍历
BFS(n,vexarray,vex);
//system("pause");
return 0;
}