用C语言写一个给定一个带权图,用普里姆算法求其最小生成树的程序
时间: 2023-10-04 12:04:06 浏览: 41
好的,以下是用C语言实现普里姆算法求解最小生成树的程序:
```c
#include <stdio.h>
#include <stdbool.h>
#define MAXV 1000
#define INF 0x3f3f3f3f
typedef struct {
int adjvex; // 与之相连的顶点编号
int weight; // 权重
} Edge;
typedef struct {
int vexnum; // 顶点数
int edgenum; // 边数
int adjmatrix[MAXV][MAXV]; // 邻接矩阵
} Graph;
Graph graph;
int lowcost[MAXV]; // 最小边权
int closest[MAXV]; // 与之相连的最近顶点
void prim() {
int i, j, k, min;
int sum = 0;
for (i = 0; i < graph.vexnum; ++i) {
lowcost[i] = INF;
closest[i] = -1;
}
lowcost[0] = 0;
for (i = 0; i < graph.vexnum; ++i) {
min = INF;
k = -1;
for (j = 0; j < graph.vexnum; ++j) {
if (lowcost[j] != 0 && lowcost[j] < min) {
min = lowcost[j];
k = j;
}
}
if (k != -1) {
lowcost[k] = 0;
sum += min;
for (j = 0; j < graph.vexnum; ++j) {
if (graph.adjmatrix[k][j] < lowcost[j]) {
lowcost[j] = graph.adjmatrix[k][j];
closest[j] = k;
}
}
}
}
printf("最小生成树的边集合为:\n");
for (i = 1; i < graph.vexnum; ++i) {
printf("(%d, %d)\n", closest[i], i);
}
printf("最小权值和为:%d\n", sum);
}
int main() {
int i, j;
printf("请输入顶点数和边数:\n");
scanf("%d %d", &graph.vexnum, &graph.edgenum);
printf("请输入邻接矩阵:\n");
for (i = 0; i < graph.vexnum; ++i) {
for (j = 0; j < graph.vexnum; ++j) {
scanf("%d", &graph.adjmatrix[i][j]);
if (graph.adjmatrix[i][j] == 0) {
graph.adjmatrix[i][j] = INF;
}
}
}
prim();
return 0;
}
```
程序中用 `Graph` 结构体表示图,其中 `adjmatrix` 为邻接矩阵,`Edge` 结构体表示图中的边。`prim` 函数实现了普里姆算法,用 `lowcost` 数组记录每个顶点到最小生成树的最小边权,用 `closest` 数组记录与之相连的最近顶点。最后输出最小生成树的边集合和权值和即可。