1.问题描述 求无向连通图的一棵生成树。 2.基本要求 (1)采用邻接矩阵存储; (2)求深度优先生成树; (3)输出该生成树的每一条边。(4)再拓展写一下广度优先生成树。要求用c语言实现
时间: 2023-06-12 10:03:30 浏览: 63
以下是基于邻接矩阵的深度优先生成树和广度优先生成树的C语言实现:
```c
#include <stdio.h>
#include <stdlib.h>
#define MAX_VERTEX_NUM 100
typedef struct {
int vertex[MAX_VERTEX_NUM];
int arcs[MAX_VERTEX_NUM][MAX_VERTEX_NUM];
int vexnum, arcnum;
}Graph;
void CreateGraph(Graph* G) {
int i, j, w;
printf("请输入图的顶点数和边数:\n");
scanf("%d%d", &(G->vexnum), &(G->arcnum));
printf("请输入图的各个顶点:\n");
for (i = 0; i < G->vexnum; i++) {
scanf("%d", &(G->vertex[i]));
}
for (i = 0; i < G->vexnum; i++) {
for (j = 0; j < G->vexnum; j++) {
G->arcs[i][j] = 0;
}
}
printf("请输入图的各条边:\n");
for (w = 0; w < G->arcnum; w++) {
int v1, v2;
scanf("%d%d", &v1, &v2);
G->arcs[v1][v2] = 1;
G->arcs[v2][v1] = 1;
}
}
int visited[MAX_VERTEX_NUM];
void DFS(Graph G, int v, int* count) {
visited[v] = 1;
int i;
for (i = 0; i < G.vexnum; i++) {
if (G.arcs[v][i] == 1 && visited[i] == 0) {
printf("(%d,%d)\n", v, i);
(*count)++;
DFS(G, i, count);
}
}
}
void DFSTraverse(Graph G) {
int i, count = 0;
for (i = 0; i < G.vexnum; i++) {
visited[i] = 0;
}
for (i = 0; i < G.vexnum; i++) {
if (visited[i] == 0) {
DFS(G, i, &count);
}
}
if (count < G.vexnum - 1) {
printf("该图不连通,无法生成树!\n");
}
}
void BFS(Graph G, int v, int* count) {
int queue[MAX_VERTEX_NUM], front = 0, rear = 0;
visited[v] = 1;
queue[rear++] = v;
while (front < rear) {
int u = queue[front++];
int i;
for (i = 0; i < G.vexnum; i++) {
if (G.arcs[u][i] == 1 && visited[i] == 0) {
printf("(%d,%d)\n", u, i);
(*count)++;
visited[i] = 1;
queue[rear++] = i;
}
}
}
}
void BFSTraverse(Graph G) {
int i, count = 0;
for (i = 0; i < G.vexnum; i++) {
visited[i] = 0;
}
for (i = 0; i < G.vexnum; i++) {
if (visited[i] == 0) {
BFS(G, i, &count);
}
}
if (count < G.vexnum - 1) {
printf("该图不连通,无法生成树!\n");
}
}
int main() {
Graph G;
CreateGraph(&G);
printf("深度优先生成树的边为:\n");
DFSTraverse(G);
printf("广度优先生成树的边为:\n");
BFSTraverse(G);
return 0;
}
```
其中,CreateGraph函数用于创建邻接矩阵图,DFS函数和DFSTraverse函数用于深度优先生成树,BFS函数和BFSTraverse函数用于广度优先生成树。在DFS和BFS函数中,count变量用于记录生成树的边数,visited数组用于标记顶点是否被访问过。在DFSTraverse和BFSTraverse函数中,如果count小于图的顶点数减一,说明该图不连通,无法生成树。