建立任意无向图,采用邻接矩阵存储,输出该图的广度优先遍历序列。C语言
时间: 2024-06-17 20:05:57 浏览: 208
建立图的邻接矩阵或邻接表存储并在此基础上实现图的深度优先遍历和广度优先遍历.doc
5星 · 资源好评率100%
建立无向图,采用邻接矩阵存储方式,需要使用一个二维数组来表示每个顶点之间的连接情况。具体来说,如果有n个顶点,则可以使用一个n*n的矩阵A来表示,其中A[i][j]=1表示顶点i和顶点j之间有一条边,A[i][j]=0则表示没有边。
下面是建立无向图的示例代码:
```
#include <stdio.h>
#include <stdlib.h>
#define MAX_VERTEX_NUM 100
typedef struct {
int vertices[MAX_VERTEX_NUM]; // 顶点数组
int edges[MAX_VERTEX_NUM][MAX_VERTEX_NUM]; // 邻接矩阵
int vertex_num; // 顶点数目
int edge_num; // 边的数目
} Graph;
// 初始化一个空图
void init_graph(Graph *g, int n) {
g->vertex_num = n;
g->edge_num = 0;
for (int i = 0; i < n; i++) {
g->vertices[i] = i;
for (int j = 0; j < n; j++) {
g->edges[i][j] = 0;
}
}
}
// 添加一条边
void add_edge(Graph *g, int i, int j) {
if (i >= 0 && i < g->vertex_num && j >= 0 && j < g->vertex_num && g->edges[i][j] == 0) {
g->edges[i][j] = 1;
g->edges[j][i] = 1;
g->edge_num++;
}
}
// 广度优先搜索遍历图
void bfs(Graph *g, int start, int visited[]) {
int queue[MAX_VERTEX_NUM];
int front = -1, rear = -1;
queue[++rear] = start;
visited[start] = 1;
while (front != rear) {
int v = queue[++front];
printf("%d ", g->vertices[v]);
for (int i = 0; i < g->vertex_num; i++) {
if (g->edges[v][i] == 1 && visited[i] == 0) {
queue[++rear] = i;
visited[i] = 1;
}
}
}
}
int main() {
Graph g;
int n = 5;
init_graph(&g, n);
add_edge(&g, 0, 1);
add_edge(&g, 0, 2);
add_edge(&g, 1, 2);
add_edge(&g, 1, 3);
add_edge(&g, 2, 3);
add_edge(&g, 3, 4);
printf("广度优先遍历序列:");
int visited[MAX_VERTEX_NUM] = {0};
bfs(&g, 0, visited);
return 0;
}
```
在上面的代码中,我们使用了一个visited数组来记录每个顶点是否已经被访问过。在遍历时,我们首先将起始顶点加入队列中,并将其标记为已访问。然后不断从队列中取出顶点v,并访问它未被访问过的邻居节点,并将这些邻居节点加入队列中。当队列为空时,遍历结束。
输出结果如下:
```
广度优先遍历序列:0 1 2 3 4
```
阅读全文