请用C++语言写一个基于邻接矩阵的广度优先遍历
时间: 2024-04-30 09:19:06 浏览: 109
下面是基于邻接矩阵的广度优先遍历的 C 语言代码:
```c
#include <stdio.h>
#include <stdlib.h>
#define MAX_VERTEX_NUM 100 // 最大顶点数
typedef int VertexType; // 顶点类型为整型
typedef int EdgeType; // 边权值类型为整型
typedef struct {
VertexType vertex[MAX_VERTEX_NUM]; // 存储顶点信息
EdgeType edge[MAX_VERTEX_NUM][MAX_VERTEX_NUM]; // 存储边权值
int vertexNum; // 顶点数目
int edgeNum; // 边数目
} MGraph;
typedef struct {
int data[MAX_VERTEX_NUM]; // 存储队列元素
int front; // 队头指针
int rear; // 队尾指针
} Queue;
// 初始化队列
void initQueue(Queue *q) {
q->front = q->rear = 0;
}
// 判断队列是否为空
int isQueueEmpty(Queue *q) {
return q->front == q->rear;
}
// 入队
int enqueue(Queue *q, int x) {
if ((q->rear + 1) % MAX_VERTEX_NUM == q->front) { // 队列已满
return 0;
}
q->data[q->rear] = x;
q->rear = (q->rear + 1) % MAX_VERTEX_NUM;
return 1;
}
// 出队
int dequeue(Queue *q, int *x) {
if (isQueueEmpty(q)) { // 队列为空
return 0;
}
*x = q->data[q->front];
q->front = (q->front + 1) % MAX_VERTEX_NUM;
return 1;
}
// 建立无向图的邻接矩阵
void createUndirectedGraph(MGraph *G) {
printf("请输入顶点数和边数:\n");
scanf("%d %d", &(G->vertexNum), &(G->edgeNum));
printf("请输入顶点信息:\n");
for (int i = 0; i < G->vertexNum; i++) {
scanf("%d", &(G->vertex[i]));
}
for (int i = 0; i < G->vertexNum; i++) {
for (int j = 0; j < G->vertexNum; j++) {
G->edge[i][j] = 0; // 初始化边权值为0
}
}
printf("请输入边的信息:\n");
for (int k = 0; k < G->edgeNum; k++) {
int i, j;
scanf("%d %d", &i, &j);
G->edge[i][j] = G->edge[j][i] = 1; // 无向图的边是对称的
}
}
// 广度优先遍历
void BFS(MGraph G, int v) {
int visited[MAX_VERTEX_NUM] = {0}; // 标记顶点是否被访问过
Queue q;
initQueue(&q);
visited[v] = 1; // 访问起始顶点v
printf("%d ", G.vertex[v]);
enqueue(&q, v); // v进队列
while (!isQueueEmpty(&q)) {
int u;
dequeue(&q, &u); // 队头元素出队列
for (int i = 0; i < G.vertexNum; i++) {
if (G.edge[u][i] == 1 && visited[i] == 0) { // u和i之间有边且i未被访问过
visited[i] = 1; // 访问顶点i
printf("%d ", G.vertex[i]);
enqueue(&q, i); // i进队列
}
}
}
}
int main() {
MGraph G;
createUndirectedGraph(&G);
printf("请输入起始顶点:\n");
int v;
scanf("%d", &v);
printf("广度优先遍历结果为:\n");
BFS(G, v);
printf("\n");
return 0;
}
```
阅读全文