c语言通过输入使用邻接矩阵的方法 创建一个图使用深度优先遍历与广度优先遍历
来遍历这个图并输出遍历结果。
#include <stdio.h>
#include <stdlib.h>
#define MAX_VERTICES 100
typedef struct {
int n; // 顶点数
int adj_matrix[MAX_VERTICES][MAX_VERTICES]; // 邻接矩阵
} Graph;
int visited[MAX_VERTICES]; // 标记是否已经被访问过
// 初始化图
void init_graph(Graph *g, int n) {
g->n = n;
for (int i = 0; i < n; i++) {
for (int j = 0; j < n; j++) {
g->adj_matrix[i][j] = 0;
}
}
}
// 添加边
void add_edge(Graph *g, int u, int v) {
g->adj_matrix[u][v] = 1;
g->adj_matrix[v][u] = 1;
}
// 深度优先遍历
void dfs(Graph *g, int v) {
visited[v] = 1;
printf("%d ", v);
for (int i = 0; i < g->n; i++) {
if (g->adj_matrix[v][i] && !visited[i]) {
dfs(g, i);
}
}
}
// 广度优先遍历
void bfs(Graph *g, int v) {
int queue[MAX_VERTICES];
int front = 0, rear = 0;
visited[v] = 1;
printf("%d ", v);
queue[rear++] = v;
while (front < rear) {
int u = queue[front++];
for (int i = 0; i < g->n; i++) {
if (g->adj_matrix[u][i] && !visited[i]) {
visited[i] = 1;
printf("%d ", i);
queue[rear++] = i;
}
}
}
}
int main() {
int n, m;
Graph g;
printf("请输入顶点数:");
scanf("%d", &n);
init_graph(&g, n);
printf("请输入边数:");
scanf("%d", &m);
printf("请输入每条边的两个顶点:\n");
for (int i = 0; i < m; i++) {
int u, v;
scanf("%d %d", &u, &v);
add_edge(&g, u, v);
}
printf("深度优先遍历结果:");
for (int i = 0; i < n; i++) {
visited[i] = 0;
}
for (int i = 0; i < n; i++) {
if (!visited[i]) {
dfs(&g, i);
}
}
printf("\n");
printf("广度优先遍历结果:");
for (int i = 0; i < n; i++) {
visited[i] = 0;
}
for (int i = 0; i < n; i++) {
if (!visited[i]) {
bfs(&g, i);
}
}
printf("\n");
return 0;
}
上面的代码中,Graph 结构体表示图,包含顶点数 n 和邻接矩阵 adj_matrix。init_graph 函数用于初始化图,add_edge 函数用于添加边。visited 数组用于标记顶点是否已经被访问过。dfs 函数和 bfs 函数分别表示深度优先遍历和广度优先遍历。主函数中通过输入顶点数和边数来创建图,然后进行深度优先遍历和广度优先遍历,并输出遍历结果
原文地址: https://www.cveoy.top/t/topic/frAo 著作权归作者所有。请勿转载和采集!