(1)创建图和实现图的深度优先遍历和广度优先遍历 a.所输入的数据要为整形数据 b.输出的形式为:每按一次回车,遍历一个结点。 c.实现对无向图的两种遍历:深度优先遍历和广度优先遍历。 程序流程: main()visited()DFS()visited()BFS()
时间: 2023-12-10 16:39:20 浏览: 184
以下是一个基于邻接矩阵的实现示例:
```c++
#include <iostream>
#include <queue>
using namespace;
const int MAXN = 100;
int graph[MAXN][MAXN]; // 邻接矩阵
bool visited[MAXN]; // 记录结点是否被访问过
// 深度优先遍历
void DFS(int cur) {
cout << cur << endl;
visited[cur] = true;
for (int i = 0; i < MAXN; i++) {
if (graph[cur][i] && !visited[i]) {
DFS(i);
}
}
}
// 广度优先遍历
void BFS(int start) {
queue<int> q;
q.push(start);
visited[start] = true;
while (!q.empty()) {
int cur = q.front();
q.pop();
cout << cur << endl;
for (int i = 0; i < MAXN; i++) {
if (graph[cur][i] && !visited[i]) {
visited[i] = true;
q.push(i);
}
}
}
}
int main() {
// 初始化邻接矩阵
for (int i = 0; i < MAXN; i++) {
for (int j = 0; j < MAXN; j++) {
graph[i][j] = 0;
}
visited[i] = false;
}
// 添加边
graph[0][1] = graph[1][0] = 1;
graph[0][2] = graph[2][0] = 1;
graph[1][3] = graph[3][1] = 1;
graph[1][4] = graph[4][1] = 1;
graph[2][4] = graph[4][2] = 1;
graph[3][4] = graph[4][3] = 1;
cout << "DFS:" << endl;
DFS(0);
for (int i = 0; i < MAXN; i++) {
visited[i] = false;
}
cout << "BFS:" << endl;
BFS(0);
return 0;
}
```
其中,我们使用一个 `visited` 数组来记录结点是否被访问过,以避免重复访问。在深度优先遍历中,我们先访问当前结点,然后对于每个未访问的相邻结点,递归调用 `DFS` 函数进行遍历。在广度优先遍历中,我们使用一个队列来记录待访问的结点,从起始结点开始,先访问当前结点,然后将其相邻的未访问结点全部加入队列中。重复这个过程,直到队列为空。
阅读全文