用c语言实现图的深度优先遍历带权无向图G采用邻接矩阵表示法存储,编写程序,输出 图G从第1个顶点开始的一个深度优先遍历序列。 输入格式:第一行两个整数分别表示图的顶点个数m、边的个数n,两个整数之间以空格分隔; 第二行的字符序列分别表示图的m个顶点的数据(为简单,每个顶点的数据为一个字符); n行数据,每行数据表示图的一条边的信息,每条边依附的两个顶点的值以及这条边的权值。 输出格式: 图的一个深度优先遍历序列,两个顶点数据之间以空格分隔。
时间: 2024-02-15 15:03:49 浏览: 61
好的,下面是 C 语言实现图的深度优先遍历的代码:
```c
#include <stdio.h>
#include <stdbool.h>
#define MAX_VERTICES 100 // 图的最大顶点数
// 邻接矩阵表示法存储图
typedef struct {
char data; // 顶点数据
int weight; // 权值
} EdgeInfo;
typedef struct {
char vertices[MAX_VERTICES]; // 存储顶点数据
EdgeInfo edges[MAX_VERTICES][MAX_VERTICES]; // 存储边的权值
int num_vertices; // 顶点数
int num_edges; // 边数
} Graph;
// 图的深度优先遍历
void dfs(Graph *g, bool visited[], int v) {
printf("%c ", g->vertices[v]); // 输出顶点数据
visited[v] = true;
for (int i = 0; i < g->num_vertices; i++) {
if (g->edges[v][i].weight != 0 && !visited[i]) {
dfs(g, visited, i);
}
}
}
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.vertices[i]);
}
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.vertices[j] == v1) {
idx1 = j;
}
if (g.vertices[j] == v2) {
idx2 = j;
}
if (idx1 != -1 && idx2 != -1) {
break;
}
}
if (idx1 != -1 && idx2 != -1) {
g.edges[idx1][idx2].weight = w;
g.edges[idx2][idx1].weight = w; // 无向图需要设置两个方向的权值
}
}
printf("深度优先遍历的序列为:");
dfs(&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
```
阅读全文