用C++创建一个有10个节点的图,并且实现图的深度优先遍历和广度优先遍历
时间: 2023-12-05 14:12:37 浏览: 83
C/C++实现图的深度优先遍历和广度优先遍历
好的,我可以回答你的问题。首先,我们可以使用邻接矩阵来表示这个有10个节点的图,如下所示:
```c++
const int MAXN = 10; // 图的最大节点数
int graph[MAXN][MAXN]; // 邻接矩阵
// 初始化邻接矩阵
memset(graph, 0, sizeof(graph));
```
接下来,我们可以使用深度优先搜索(DFS)和广度优先搜索(BFS)来遍历这个图。
DFS的基本思路是从一个节点出发,沿着一条路径尽可能深地访问,直到这条路径到达最深处,然后回溯到前一个节点,再选择另一条路径继续访问,直到所有节点都被访问过。
BFS的基本思路是从一个节点出发,将其所有未访问过的邻居节点加入队列中,然后逐个访问队列中的节点,并将它们的未访问过的邻居节点加入队列中,直到所有节点都被访问过。
下面是实现深度优先遍历和广度优先遍历的完整代码:
```c++
#include <iostream>
#include <queue>
#include <cstring>
using namespace std;
const int MAXN = 10; // 图的最大节点数
int graph[MAXN][MAXN]; // 邻接矩阵
bool visited[MAXN]; // 节点是否已被访问过的标志
// 初始化邻接矩阵
void init_graph() {
memset(graph, 0, sizeof(graph));
}
// 深度优先遍历
void dfs(int u) {
visited[u] = true;
cout << u << " ";
for (int v = 0; v < MAXN; v++) {
if (graph[u][v] && !visited[v]) {
dfs(v);
}
}
}
// 广度优先遍历
void bfs(int u) {
queue<int> q;
visited[u] = true;
q.push(u);
while (!q.empty()) {
int v = q.front();
q.pop();
cout << v << " ";
for (int w = 0; w < MAXN; w++) {
if (graph[v][w] && !visited[w]) {
visited[w] = true;
q.push(w);
}
}
}
}
int main() {
init_graph();
// 添加边
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][5] = graph[5][2] = 1;
graph[2][6] = graph[6][2] = 1;
graph[3][7] = graph[7][3] = 1;
graph[4][8] = graph[8][4] = 1;
graph[5][9] = graph[9][5] = 1;
// 深度优先遍历
memset(visited, false, sizeof(visited));
dfs(0);
cout << endl;
// 广度优先遍历
memset(visited, false, sizeof(visited));
bfs(0);
cout << endl;
return 0;
}
```
输出结果为:
```
0 1 3 7 4 8 2 5 9 6
0 1 2 3 4 5 6 7 8 9
```
这两个遍历算法是图的基础,可以用于解决一些图论问题。
阅读全文