使用c语言实现基于邻接矩阵实现图的广度优先遍历
时间: 2024-05-10 22:17:44 浏览: 197
C++实现图的邻接矩阵存储和广度、深度优先遍历实例分析
广度优先遍历(BFS)是一种图的遍历算法,可以用来找到从某个节点出发,到其他所有节点的最短路径。下面是使用 C 语言实现基于邻接矩阵的图的广度优先遍历的示例代码:
```c
#include <stdio.h>
#include <stdlib.h>
#include <stdbool.h>
#define MAX_VERTICES 100
int adj_matrix[MAX_VERTICES][MAX_VERTICES];
bool visited[MAX_VERTICES];
int queue[MAX_VERTICES];
int front = 0, rear = -1;
void bfs(int v, int n) {
visited[v] = true;
queue[++rear] = v;
while (front <= rear) {
int cur = queue[front++];
printf("%d ", cur);
for (int i = 0; i < n; i++) {
if (adj_matrix[cur][i] == 1 && !visited[i]) {
visited[i] = true;
queue[++rear] = i;
}
}
}
}
int main() {
int n, e; // n 表示顶点个数,e 表示边的个数
scanf("%d %d", &n, &e);
for (int i = 0; i < e; i++) {
int u, v; // u 和 v 表示一条边的两个端点
scanf("%d %d", &u, &v);
adj_matrix[u][v] = 1;
adj_matrix[v][u] = 1; // 无向图需要把边反向再存一次
}
for (int i = 0; i < n; i++) {
visited[i] = false;
}
bfs(0, n);
return 0;
}
```
在这个示例代码中,我们首先定义了一个邻接矩阵 `adj_matrix`,用于存储图的边,同时还定义了一个 `visited` 数组,用于标记每个节点是否已经被访问过。我们还定义了一个队列 `queue`,用于存储待访问的节点。在 `bfs` 函数中,我们首先将起始节点加入队列中,并标记为已访问,然后循环访问队列中的节点,对于每个节点,我们遍历与其相邻的节点,并将其加入队列中。最后,我们输出访问过的节点,就得到了广度优先遍历的结果。
在 `main` 函数中,我们读入图的顶点个数和边的个数,然后读入每条边的两个端点,并将其存入邻接矩阵中。我们还需要将 `visited` 数组初始化为 false。最后,我们调用 `bfs` 函数进行广度优先遍历,并输出结果。
阅读全文