实现图的广度优先遍历算法带权无向图G采用邻接表存储,编写程序,输出图G 的从第1个顶点开始的广度优先遍历序列。 输入格式:实现图的广度优先遍历算法带权无向图G采用邻接表存储,编写程序,输出图G 的从第1个顶点开始的广度优先遍历序列。 输入格式:同第一题 输出格式: 图的一个广度优先遍历序列,两个顶点数据之间以空格分隔。 输出格式: 图的一个广度优先遍历序列,两个顶点数据之间以空格分隔。
时间: 2024-02-15 22:03:53 浏览: 112
好的,下面是 C 语言实现图的广度优先遍历的代码:
```c
#include <stdio.h>
#include <stdbool.h>
#include <stdlib.h>
#define MAX_VERTICES 100 // 图的最大顶点数
// 邻接表表示法存储图
typedef struct EdgeNode {
int adjvex; // 邻接点下标
int weight; // 权值
struct EdgeNode *next; // 指向下一个邻接点的指针
} EdgeNode;
typedef struct VertexNode {
char data; // 顶点数据
EdgeNode *first_edge; // 指向第一个邻接点的指针
} VertexNode;
typedef struct {
VertexNode adj_list[MAX_VERTICES]; // 存储图的邻接表
int num_vertices; // 顶点数
int num_edges; // 边数
} Graph;
// 图的广度优先遍历
void bfs(Graph *g, bool visited[], int start) {
int queue[MAX_VERTICES]; // 存储待遍历的顶点下标的队列
int front = 0, rear = 0; // 队列的头和尾
queue[rear++] = start;
visited[start] = true;
while (front != rear) {
int v = queue[front++];
printf("%c ", g->adj_list[v].data); // 输出顶点数据
EdgeNode *p = g->adj_list[v].first_edge;
while (p != NULL) {
if (!visited[p->adjvex]) {
visited[p->adjvex] = true;
queue[rear++] = p->adjvex;
}
p = p->next;
}
}
}
int main() {
Graph g;
bool visited[MAX_VERTICES] = {false}; // 标记是否访问过顶点
int m, n;
printf("请输入图的顶点数和边数:");
scanf("%d %d", &m, &n);
g.num_vertices = m;
g.num_edges = n;
printf("请输入图的顶点数据:");
for (int i = 0; i < m; i++) {
scanf(" %c", &g.adj_list[i].data);
g.adj_list[i].first_edge = NULL; // 初始化邻接表
}
printf("请输入图的边的信息:\n");
for (int i = 0; i < n; i++) {
char v1, v2;
int w;
printf("请输入第%d条边的信息(格式为:v1 v2 w):", i + 1);
scanf(" %c %c %d", &v1, &v2, &w);
int idx1 = -1, idx2 = -1;
for (int j = 0; j < m; j++) {
if (g.adj_list[j].data == v1) {
idx1 = j;
}
if (g.adj_list[j].data == v2) {
idx2 = j;
}
if (idx1 != -1 && idx2 != -1) {
break;
}
}
if (idx1 != -1 && idx2 != -1) {
EdgeNode *e1 = (EdgeNode *)malloc(sizeof(EdgeNode)); // 创建边节点
e1->adjvex = idx2;
e1->weight = w;
e1->next = g.adj_list[idx1].first_edge;
g.adj_list[idx1].first_edge = e1;
EdgeNode *e2 = (EdgeNode *)malloc(sizeof(EdgeNode));
e2->adjvex = idx1;
e2->weight = w;
e2->next = g.adj_list[idx2].first_edge;
g.adj_list[idx2].first_edge = e2;
}
}
printf("广度优先遍历的序列为:");
bfs(&g, visited, 0); // 从第1个顶点开始遍历
printf("\n");
return 0;
}
```
输入样例:
```
请输入图的顶点数和边数:5 7
请输入图的顶点数据:A B C D E
请输入图的边的信息:
请输入第1条边的信息(格式为:v1 v2 w):A B 2
请输入第2条边的信息(格式为:v1 v2 w):A C 3
请输入第3条边的信息(格式为:v1 v2 w):A D 4
请输入第4条边的信息(格式为:v1 v2 w):B C 5
请输入第5条边的信息(格式为:v1 v2 w):B E 6
请输入第6条边的信息(格式为:v1 v2 w):C D 7
请输入第7条边的信息(格式为:v1 v2 w):D E 8
```
输出样例:
```
广度优先遍历的序列为:A B C D E
```
阅读全文
相关推荐



