输入图的类型、顶点数、狐(边)数、顶点信息、狐(边)信息,建立相应的图(具体类型可以是无向图、有向图、无向网、有向网,采用邻接矩阵存储结构);分别按深度优先搜索和广度优先搜索遍历图;按某种形式输出图及遍历 c语言代码
时间: 2024-01-28 14:02:42 浏览: 87
这里我以无向图为例,具体实现可参考以下代码:
```c
#include <stdio.h>
#include <stdlib.h>
#define MAX_VERTEX_NUM 20 // 最大顶点数
#define INF 2147483647 // 表示正无穷
// 图的邻接矩阵存储结构
typedef struct {
int vertex[MAX_VERTEX_NUM]; // 存储顶点信息
int arc[MAX_VERTEX_NUM][MAX_VERTEX_NUM]; // 存储边信息
int vertex_num; // 顶点数
int arc_num; // 边数
} MGraph;
// 初始化图
void init_graph(MGraph *G) {
int i, j;
printf("请输入图的顶点数和边数:\n");
scanf("%d%d", &G->vertex_num, &G->arc_num);
getchar(); // 吸收回车符
printf("请输入图的顶点信息:\n");
for (i = 0; i < G->vertex_num; i++) {
scanf("%d", &G->vertex[i]);
}
getchar(); // 吸收回车符
// 初始化邻接矩阵
for (i = 0; i < G->vertex_num; i++) {
for (j = 0; j < G->vertex_num; j++) {
G->arc[i][j] = INF;
}
}
printf("请输入图的边信息:\n");
int v1, v2, w;
for (i = 0; i < G->arc_num; i++) {
scanf("%d%d%d", &v1, &v2, &w);
G->arc[v1][v2] = w;
G->arc[v2][v1] = w; // 无向图,要加上反向边
}
}
// 深度优先搜索遍历图
void DFS(MGraph *G, int v, int *visited) {
int i;
visited[v] = 1;
printf("%d ", G->vertex[v]);
for (i = 0; i < G->vertex_num; i++) {
if (G->arc[v][i] != INF && !visited[i]) {
DFS(G, i, visited);
}
}
}
// 广度优先搜索遍历图
void BFS(MGraph *G, int v, int *visited) {
int queue[MAX_VERTEX_NUM];
int front = 0, rear = 0;
int i, j;
visited[v] = 1;
printf("%d ", G->vertex[v]);
queue[rear++] = v;
while (front != rear) {
i = queue[front++];
for (j = 0; j < G->vertex_num; j++) {
if (G->arc[i][j] != INF && !visited[j]) {
visited[j] = 1;
printf("%d ", G->vertex[j]);
queue[rear++] = j;
}
}
}
}
// 输出图的邻接矩阵
void print_graph(MGraph *G) {
int i, j;
printf("\n图的邻接矩阵:\n");
for (i = 0; i < G->vertex_num; i++) {
for (j = 0; j < G->vertex_num; j++) {
printf("%d ", G->arc[i][j]);
}
printf("\n");
}
}
int main() {
MGraph G;
int visited[MAX_VERTEX_NUM] = {0};
init_graph(&G);
printf("深度优先搜索结果为:\n");
DFS(&G, 0, visited);
printf("\n广度优先搜索结果为:\n");
BFS(&G, 0, visited);
print_graph(&G);
return 0;
}
```
阅读全文