请按需求编写c语言代码
时间: 2023-07-29 14:11:27 浏览: 14
好的,请看下面的代码实现:
```
#include <stdio.h>
#include <stdlib.h>
#include <stdbool.h>
#define MAX_VERTEX_NUM 100 // 最大顶点数
typedef struct {
int vertex[MAX_VERTEX_NUM]; // 顶点数组
int edge[MAX_VERTEX_NUM][MAX_VERTEX_NUM]; // 邻接矩阵
int vertex_num; // 顶点数
int edge_num; // 边数
} Graph;
void InitGraph(Graph *G) { // 初始化图
printf("请输入图的顶点数和边数:");
scanf("%d %d", &G->vertex_num, &G->edge_num);
printf("请输入图的顶点(用空格分隔):");
for (int i = 0; i < G->vertex_num; i++) {
scanf("%d", &G->vertex[i]);
}
for (int i = 0; i < G->vertex_num; i++) {
for (int j = 0; j < G->vertex_num; j++) {
G->edge[i][j] = 0; // 初始化邻接矩阵
}
}
printf("请输入图的边(用空格分隔):\n");
for (int i = 0; i < G->edge_num; i++) {
int v1, v2;
scanf("%d %d", &v1, &v2);
G->edge[v1][v2] = 1; // 加边
G->edge[v2][v1] = 1;
}
}
void BFS(Graph G, int start, int end) { // 广度优先搜索
int queue[MAX_VERTEX_NUM]; // 队列
int visited[MAX_VERTEX_NUM] = {0}; // 标记数组,记录顶点是否已访问
int path[MAX_VERTEX_NUM]; // 路径数组,记录该点的前驱顶点
int front = 0, rear = 0; // 队头指针和队尾指针
queue[rear++] = start; // 入队
visited[start] = 1; // 标记已访问
while (front != rear) { // 队列非空
int v = queue[front++]; // 出队
for (int i = 0; i < G.vertex_num; i++) {
if (G.edge[v][i] == 1 && visited[i] == 0) { // 如果与当前顶点相邻且未访问
queue[rear++] = i; // 入队
visited[i] = 1; // 标记已访问
path[i] = v; // 记录前驱顶点
if (i == end) { // 如果找到终点
printf("A到B的路径为:");
int p = i;
printf("%d ", G.vertex[p]);
while (p != start) { // 逆向输出路径
p = path[p];
printf("%d ", G.vertex[p]);
}
printf("\n");
return;
}
}
}
}
printf("There is no path.\n"); // 未找到路径
}
int main() {
Graph G;
InitGraph(&G);
int start, end;
printf("请输入要找的路径的起点和终点:");
scanf("%d %d", &start, &end);
BFS(G, start, end);
return 0;
}
```
注意:上述代码中的 `InitGraph` 函数用于初始化图,其中包括输入图的顶点数、边数、顶点以及边,这一部分可以根据需求进行修改。另外,代码中使用了邻接矩阵存储图,如果需要使用其他存储方式,请自行进行修改。
相关推荐


















