用c语言写出用邻接矩阵作为图的存储结构建立一个网,并构造该网的最小生成树
时间: 2024-03-16 12:46:27 浏览: 53
好的,以下是用C语言实现邻接矩阵存储图并构造最小生成树的代码:
```c
#include <stdio.h>
#include <stdlib.h>
#include <limits.h>
#define MAX_VERTICES 100
#define INF INT_MAX
// 邻接矩阵存储图的结构体
typedef struct {
int n; // 顶点数
int weight[MAX_VERTICES][MAX_VERTICES]; // 边的权重
} Graph;
// 初始化邻接矩阵图
void init_graph(Graph* g, int n) {
int i, j;
g->n = n;
for (i = 0; i < n; i++) {
for (j = 0; j < n; j++) {
g->weight[i][j] = INF;
}
}
}
// 添加边
void add_edge(Graph* g, int u, int v, int w) {
g->weight[u][v] = w;
}
// Prim算法构造最小生成树
void prim(Graph* g, int* parent) {
int i, j, k, min;
int u, v;
int distance[MAX_VERTICES]; // 存储每个顶点到已选择顶点集合的最短距离
int visited[MAX_VERTICES]; // 记录每个顶点是否已经在已选择顶点集合中
for (i = 0; i < g->n; i++) {
distance[i] = g->weight[0][i]; // 初始化为0号顶点到各个顶点的距离
visited[i] = 0;
parent[i] = 0; // 初始化0号顶点为各个顶点的父节点
}
visited[0] = 1; // 将0号顶点放入已选择顶点集合中
for (i = 1; i < g->n; i++) {
min = INF;
for (j = 0; j < g->n; j++) {
if (!visited[j] && distance[j] < min) {
min = distance[j];
k = j; // 找到离已选择顶点集合最近的顶点
}
}
visited[k] = 1; // 将k号顶点放入已选择顶点集合中
for (j = 0; j < g->n; j++) {
if (!visited[j] && g->weight[k][j] < distance[j]) {
distance[j] = g->weight[k][j]; // 更新未选择顶点到已选择顶点集合的最短距离
parent[j] = k; // 更新未选择顶点的父节点为k号顶点
}
}
}
}
// 打印最小生成树的边
void print_mst(Graph* g, int* parent) {
int i;
printf("Minimum Spanning Tree:\n");
for (i = 1; i < g->n; i++) {
printf("(%d, %d)\n", parent[i], i);
}
}
int main() {
Graph g;
int parent[MAX_VERTICES];
int n = 6; // 顶点数
init_graph(&g, n);
add_edge(&g, 0, 1, 6);
add_edge(&g, 0, 2, 1);
add_edge(&g, 0, 3, 5);
add_edge(&g, 1, 2, 5);
add_edge(&g, 1, 4, 3);
add_edge(&g, 2, 3, 5);
add_edge(&g, 2, 4, 6);
add_edge(&g, 2, 5, 4);
add_edge(&g, 3, 5, 2);
add_edge(&g, 4, 5, 6);
prim(&g, parent);
print_mst(&g, parent);
return 0;
}
```
代码中使用了Prim算法构造最小生成树,时间复杂度为O(n^2),其中n为顶点数。建议结合代码和注释详细理解实现过程。
阅读全文