用c语言写:编程实现:输入图的邻接矩阵, 然后用 BFS遍历图。
时间: 2024-03-15 14:45:03 浏览: 66
分别采用邻接矩阵、邻接表存储结构实现图的遍历
4星 · 用户满意度95%
好的,以下是 C 语言代码实现:
```c
#include <stdio.h>
#include <stdlib.h>
#include <stdbool.h>
#define MAX_N 100 // 最大节点数
// 输入邻接矩阵,返回 BFS 遍历结果
int* bfs(int adj_matrix[MAX_N][MAX_N], int n) {
bool visited[MAX_N] = {false}; // 标记每个节点是否已经访问过
int queue[MAX_N] = {0}; // 用数组实现队列
int front = 0, rear = 0; // 队列的头尾指针
int* res = (int*)malloc(sizeof(int) * n); // BFS 遍历结果
int cnt = 0; // 已经遍历的节点数
// 对每个节点进行 BFS 遍历
for (int i = 0; i < n; i++) {
if (!visited[i]) {
visited[i] = true;
queue[rear++] = i;
while (front < rear) {
int cur_node = queue[front++];
res[cnt++] = cur_node;
// 将当前节点未访问过的邻居加入队列
for (int j = 0; j < n; j++) {
if (adj_matrix[cur_node][j] && !visited[j]) {
visited[j] = true;
queue[rear++] = j;
}
}
}
}
}
return res;
}
int main() {
int n, adj_matrix[MAX_N][MAX_N];
printf("请输入节点数 n:\n");
scanf("%d", &n);
printf("请输入邻接矩阵:\n");
for (int i = 0; i < n; i++) {
for (int j = 0; j < n; j++) {
scanf("%d", &adj_matrix[i][j]);
}
}
int* res = bfs(adj_matrix, n);
printf("BFS 遍历结果为:\n");
for (int i = 0; i < n; i++) {
printf("%d ", res[i]);
}
printf("\n");
free(res);
return 0;
}
```
其中,`adj_matrix` 是邻接矩阵,如果节点 i 和节点 j 之间有边相连,则 `adj_matrix[i][j]` 为 1,否则为 0。`bfs(adj_matrix, n)` 函数返回 BFS 遍历结果,即所有节点的遍历顺序。在 `main` 函数中,先输入节点数和邻接矩阵,然后调用 `bfs(adj_matrix, n)` 函数得到 BFS 遍历结果。最后释放动态分配的内存并退出程序。
阅读全文