用c语言编写一段代码【问题描述】 请基于邻接矩阵存储结构构建带权无向图,输出其深度遍历序列和广度遍历序列。 【输入形式】 输入数据有多行,首行m和n,表示图有m个顶点和n条边;第二行是m个顶点名称,中间空格分隔;之后为n条边,表示形式为:起点名称 终点名称 权值;最后一行为遍历的起点名称。 【输出形式】 输出数据有两行,首行为深度遍历序列,末行为广度遍历序列。 【样例输入】 4 5 A B C D A B 5 A C 2 A D 1 B C 4 C D 6 A 【样例输出】 A B C D A B C D
时间: 2024-02-04 18:02:13 浏览: 68
```c
#include <stdio.h>
#include <stdlib.h>
#include <stdbool.h>
#define MAXVEX 100 // 最大顶点数
typedef struct {
char vexs[MAXVEX]; // 存储顶点的数组
int arc[MAXVEX][MAXVEX]; // 邻接矩阵,用于存储边的权值
int numVertexes; // 图中当前的顶点数
int numEdges; // 图中当前的边数
} MGraph;
// 初始化一个无向图
void CreateMGraph(MGraph *G) {
int i, j, k;
int weight; // 权值
char c1, c2; // 顶点名称
// 输入顶点数和边数
printf("请输入顶点数和边数:\n");
scanf("%d%d", &G->numVertexes, &G->numEdges);
// 输入顶点名称
printf("请输入顶点名称:\n");
for (i = 0; i < G->numVertexes; i++) {
scanf(" %c", &G->vexs[i]);
}
// 初始化邻接矩阵
for (i = 0; i < G->numVertexes; i++) {
for (j = 0; j < G->numVertexes; j++) {
G->arc[i][j] = 0; // 初始化为0
}
}
// 构建邻接矩阵,即赋值边的权值
for (k = 0; k < G->numEdges; k++) {
printf("请输入第%d条边(Vi,Vj)的下标i,下标j和权值w:\n", k + 1);
scanf(" %c %c %d", &c1, &c2, &weight);
// 由顶点名称获取顶点下标
i = c1 - 'A';
j = c2 - 'A';
// 赋值边的权值
G->arc[i][j] = weight;
G->arc[j][i] = weight; // 无向图邻接矩阵对称
}
}
// 输出邻接矩阵
void PrintMGraph(MGraph G) {
int i, j;
printf("邻接矩阵:\n");
for (i = 0; i < G.numVertexes; i++) {
for (j = 0; j < G.numVertexes; j++) {
printf("%d ", G.arc[i][j]);
}
printf("\n");
}
}
bool visited[MAXVEX]; // 访问标志数组
// 深度优先遍历
void DFS(MGraph G, int i) {
int j;
visited[i] = true; // 标记为已访问
printf("%c ", G.vexs[i]); // 输出节点数据
for (j = 0; j < G.numVertexes; j++) {
if (G.arc[i][j] != 0 && !visited[j]) { // 如果有边且未访问
DFS(G, j); // 递归访问
}
}
}
// 深度优先遍历(驱动函数)
void DFSTraverse(MGraph G) {
int i;
for (i = 0; i < G.numVertexes; i++) {
visited[i] = false; // 初始化为未访问
}
for (i = 0; i < G.numVertexes; i++) {
if (!visited[i]) { // 如果未访问
DFS(G, i); // 从该顶点开始深度优先遍历
}
}
}
// 广度优先遍历
void BFS(MGraph G, int i) {
int j;
int queue[MAXVEX]; // 队列
int front = -1; // 队头指针
int rear = -1; // 队尾指针
visited[i] = true; // 标记为已访问
printf("%c ", G.vexs[i]); // 输出节点数据
rear++; // 入队
queue[rear] = i;
while (front != rear) { // 队列不为空
front++; // 出队
i = queue[front];
for (j = 0; j < G.numVertexes; j++) {
if (G.arc[i][j] != 0 && !visited[j]) { // 如果有边且未访问
visited[j] = true; // 标记为已访问
printf("%c ", G.vexs[j]); // 输出节点数据
rear++; // 入队
queue[rear] = j;
}
}
}
}
// 广度优先遍历(驱动函数)
void BFSTraverse(MGraph G) {
int i;
for (i = 0; i < G.numVertexes; i++) {
visited[i] = false; // 初始化为未访问
}
for (i = 0; i < G.numVertexes; i++) {
if (!visited[i]) { // 如果未访问
BFS(G, i); // 从该顶点开始广度优先遍历
}
}
}
int main() {
MGraph G;
CreateMGraph(&G);
PrintMGraph(G);
char start;
printf("请输入遍历的起点名称:\n");
scanf(" %c", &start);
printf("深度遍历序列:");
DFSTraverse(G);
printf("\n广度遍历序列:");
BFSTraverse(G);
printf("\n");
return 0;
}
```
阅读全文