邻接矩阵的广度优先搜索C语言
时间: 2024-06-05 18:05:48 浏览: 106
邻接矩阵是一种用于表示图的数据结构,其中顶点用一维数组表示,边用二维矩阵表示。广度优先搜索是一种图遍历算法,从起始顶点开始,逐层遍历其邻接点,直到遍历完整张图。
在C语言中,实现邻接矩阵的广度优先搜索可以按照以下步骤:
1. 定义邻接矩阵结构体,包含顶点数和边数,以及一个二维数组存储边的信息。
2. 定义队列结构体和相关操作函数,用于存储遍历过的顶点。
3. 定义一个函数实现广度优先搜索算法,输入参数为邻接矩阵和起始顶点,输出为遍历结果。
4. 在广度优先搜索函数中,首先将起始顶点入队,并标记为已访问。然后从队列中取出一个顶点,遍历其未被访问过的邻接点,并将其入队。
5. 重复步骤4,直到队列为空。
以下是一个简单的示例代码:
```
#include <stdio.h>
#include <stdlib.h>
#define MAX_VERTEX_NUM 100
typedef struct {
int vertex[MAX_VERTEX_NUM];
int edge[MAX_VERTEX_NUM][MAX_VERTEX_NUM];
int vertex_num, edge_num;
} MGraph;
typedef struct {
int data[MAX_VERTEX_NUM];
int front, rear;
} Queue;
void InitQueue(Queue *q) {
q->front = q->rear = 0;
}
void EnQueue(Queue *q, int x) {
q->data[q->rear++] = x;
}
int DeQueue(Queue *q) {
return q->data[q->front++];
}
int IsQueueEmpty(Queue *q) {
return q->front == q->rear;
}
void BFS(MGraph g, int start) {
int visited[MAX_VERTEX_NUM] = {0};
Queue q;
InitQueue(&q);
visited[start] = 1;
printf("%d ", g.vertex[start]);
EnQueue(&q, start);
while (!IsQueueEmpty(&q)) {
int u = DeQueue(&q);
for (int v = 0; v < g.vertex_num; v++) {
if (g.edge[u][v] && !visited[v]) {
visited[v] = 1;
printf("%d ", g.vertex[v]);
EnQueue(&q, v);
}
}
}
}
int main() {
MGraph g;
g.vertex_num = 5;
g.edge_num = 7;
for (int i = 0; i < g.vertex_num; i++) {
g.vertex[i] = i;
}
g.edge = g.edge = 1;
g.edge = g.edge = 1;
g.edge = g.edge = 1;
g.edge = g.edge = 1;
g.edge = g.edge = 1;
g.edge = g.edge = 1;
BFS(g, 0);
return 0;
}
```
阅读全文