用c++语言写一个程序完成图的深度优先遍历算法和广度优先遍历并给每行代码添加注释
时间: 2024-03-10 14:48:16 浏览: 67
C/C++实现图的深度优先遍历和广度优先遍历
好的,下面是用C++语言实现图的深度优先遍历算法和广度优先遍历的程序,并添加了注释。
```c++
#include<iostream>
#include<queue>
#include<stack>
using namespace std;
const int MAX = 100; // 定义最大顶点数
int visited[MAX]; // 记录每个顶点是否被访问过
// 邻接矩阵存储图
struct Graph {
int matrix[MAX][MAX]; // 邻接矩阵
int vertexNum; // 顶点数
int edgeNum; // 边数
};
// 深度优先遍历
void DFS(Graph G, int vertex) {
visited[vertex] = 1; // 标记当前顶点已被访问
cout << vertex << " "; // 输出当前顶点
// 遍历当前顶点的所有邻接顶点
for(int i = 0; i < G.vertexNum; i++) {
if(G.matrix[vertex][i] == 1 && visited[i] == 0) { // 如果当前顶点与邻接顶点之间有边且邻接顶点未被访问
DFS(G, i); // 递归访问邻接顶点
}
}
}
// 广度优先遍历
void BFS(Graph G, int vertex) {
queue<int> q; // 定义一个队列,用于存储待访问的顶点
visited[vertex] = 1; // 标记当前顶点已被访问
q.push(vertex); // 将当前顶点入队
while(!q.empty()) {
int temp = q.front(); // 取出队首元素
q.pop(); // 出队
cout << temp << " "; // 输出当前顶点
// 遍历当前顶点的所有邻接顶点
for(int i = 0; i < G.vertexNum; i++) {
if(G.matrix[temp][i] == 1 && visited[i] == 0) { // 如果当前顶点与邻接顶点之间有边且邻接顶点未被访问
visited[i] = 1; // 标记邻接顶点已被访问
q.push(i); // 将邻接顶点入队
}
}
}
}
int main() {
Graph G;
// 初始化图
G.vertexNum = 5;
G.edgeNum = 6;
for(int i = 0; i < G.vertexNum; i++) {
visited[i] = 0;
for(int j = 0; j < G.vertexNum; j++) {
G.matrix[i][j] = 0;
}
}
G.matrix[0][1] = G.matrix[1][0] = 1;
G.matrix[0][2] = G.matrix[2][0] = 1;
G.matrix[1][2] = G.matrix[2][1] = 1;
G.matrix[1][3] = G.matrix[3][1] = 1;
G.matrix[2][3] = G.matrix[3][2] = 1;
G.matrix[3][4] = G.matrix[4][3] = 1;
cout << "深度优先遍历结果:" << endl;
DFS(G, 0); // 从顶点0开始深度优先遍历
cout << endl;
for(int i = 0; i < G.vertexNum; i++) {
visited[i] = 0;
}
cout << "广度优先遍历结果:" << endl;
BFS(G, 0); // 从顶点0开始广度优先遍历
cout << endl;
return 0;
}
```
代码注释:
1. `visited` 数组用于记录每个顶点是否被访问过,初始值为0,表示未被访问过。
2. `Graph` 结构体用于存储图的邻接矩阵表示法,包括顶点数、边数以及邻接矩阵。
3. `DFS` 函数为深度优先遍历函数,参数为当前图和当前顶点。首先标记当前顶点已被访问,输出当前顶点,然后遍历当前顶点的所有邻接顶点,如果邻接顶点未被访问过,则递归访问邻接顶点。
4. `BFS` 函数为广度优先遍历函数,参数为当前图和当前顶点。首先标记当前顶点已被访问,将当前顶点入队,然后循环执行下列操作:取出队首元素,输出当前顶点,遍历当前顶点的所有邻接顶点,如果邻接顶点未被访问过,则标记已被访问并将其入队。
5. `main` 函数为程序入口。首先初始化图,然后分别从顶点0开始执行深度优先遍历和广度优先遍历。
阅读全文