用C语言实现图的广度优先遍历的代码
时间: 2024-04-30 17:20:05 浏览: 74
C++实现图的邻接表存储和广度优先遍历实例分析
以下是用C语言实现图的广度优先遍历的代码,假设图的顶点存储在一个数组中,边存储在邻接矩阵中:
```c
#include <stdio.h>
#include <stdbool.h>
#define MAXV 100 // 最大顶点数
bool visited[MAXV]; // 记录每个顶点是否被访问过
int graph[MAXV][MAXV]; // 存储邻接矩阵
int queue[MAXV]; // 队列
int front = 0, rear = 0; // 队首和队尾指针
void bfs(int start, int n) {
int v, w;
// 初始化visited数组
for (int i = 0; i < n; i++) {
visited[i] = false;
}
// 将起点入队并标记为已访问
queue[rear++] = start;
visited[start] = true;
// 开始遍历
while (front != rear) {
v = queue[front++]; // 出队
printf("%d ", v);
// 遍历v的所有邻接点
for (w = 0; w < n; w++) {
if (graph[v][w] && !visited[w]) { // 如果w是v的邻接点且未被访问过
queue[rear++] = w; // 入队
visited[w] = true;
}
}
}
}
int main() {
int n, m, u, v;
// 读入顶点数和边数
scanf("%d%d", &n, &m);
// 读入边
for (int i = 0; i < m; i++) {
scanf("%d%d", &u, &v);
graph[u][v] = graph[v][u] = 1; // 无向图
}
// 从顶点0开始进行广度优先遍历并输出结果
bfs(0, n);
return 0;
}
```
其中,`visited`数组记录每个顶点是否被访问过,`queue`数组作为队列存储待访问的顶点,`front`和`rear`指针分别指向队首和队尾。`bfs`函数实现广度优先遍历的过程,起点入队并标记为已访问,然后开始遍历队列中的顶点,对于每个顶点,遍历它的所有邻接点,如果邻接点未被访问过,则将其入队并标记为已访问。最后输出遍历结果。
阅读全文