c语言代码建立如下有权无向图,并用prim算法构造最小生成树
时间: 2023-07-22 19:11:28 浏览: 107
用prim算法构造最小生成树
5星 · 资源好评率100%
以下是用 C 语言建立有权无向图,并使用 Prim 算法构造最小生成树的代码:
```c
#include <stdio.h>
#include <stdlib.h>
#include <limits.h>
#define MAX_VERTICES 100
#define INF INT_MAX
int n; // 图的顶点数
int dist[MAX_VERTICES]; // 存放从已经包含在最小生成树中的顶点到其它顶点的最短距离
int visited[MAX_VERTICES]; // 标记顶点是否已经包含在最小生成树中
int graph[MAX_VERTICES][MAX_VERTICES]; // 存放图的邻接矩阵
void prim() {
int i, j, k;
int min;
int u;
// 初始化
for (i = 0; i < n; i++) {
dist[i] = INF;
visited[i] = 0;
}
dist[0] = 0;
for (i = 0; i < n; i++) {
min = INF;
for (j = 0; j < n; j++) {
if (!visited[j] && dist[j] < min) {
min = dist[j];
u = j;
}
}
visited[u] = 1;
for (k = 0; k < n; k++) {
if (!visited[k] && graph[u][k] < dist[k]) {
dist[k] = graph[u][k];
}
}
}
}
int main() {
int i, j;
// 读入图的邻接矩阵
scanf("%d", &n);
for (i = 0; i < n; i++) {
for (j = 0; j < n; j++) {
scanf("%d", &graph[i][j]);
}
}
prim();
// 输出最小生成树的边权和
int sum = 0;
for (i = 0; i < n; i++) {
sum += dist[i];
}
printf("%d\n", sum);
return 0;
}
```
在上述代码中,`graph` 数组存放有权无向图的邻接矩阵,`dist` 数组存放从已经包含在最小生成树中的顶点到其它顶点的最短距离,`visited` 数组标记顶点是否已经包含在最小生成树中。`prim()` 函数使用 Prim 算法构造最小生成树。在主函数中,我们首先读入图的邻接矩阵,然后调用 `prim()` 函数构造最小生成树,并输出最小生成树的边权和。
阅读全文