用c语言完成prim最小生成树编写
时间: 2023-07-22 08:10:15 浏览: 107
Prim算法最小生成树(C语言)
好的,以下是用C语言实现Prim算法求最小生成树的代码:
```c
#include <stdio.h>
#include <stdbool.h>
#define INF 0x3f3f3f3f
#define MAXN 100
int graph[MAXN][MAXN]; // 图的邻接矩阵
int d[MAXN]; // 存储每个节点到已选节点集合的最小距离
bool visited[MAXN]; // 判断每个节点是否已经加入最小生成树
int prim(int n) // n表示节点个数
{
int i, j, min, min_index, total_cost = 0;
// 初始化
for (i = 0; i < n; i++) {
d[i] = INF;
visited[i] = false;
}
d[0] = 0; // 从0号节点开始
for (i = 0; i < n; i++) {
// 找到离最小生成树最近的节点
min = INF;
for (j = 0; j < n; j++) {
if (!visited[j] && d[j] < min) {
min = d[j];
min_index = j;
}
}
visited[min_index] = true; // 将该节点加入最小生成树
total_cost += min; // 更新最小生成树的总权值
// 更新距离
for (j = 0; j < n; j++) {
if (!visited[j] && graph[min_index][j] < d[j]) {
d[j] = graph[min_index][j];
}
}
}
return total_cost;
}
int main()
{
int n, m, i, j, u, v, w;
scanf("%d%d", &n, &m); // 输入节点个数和边数
// 初始化图
for (i = 0; i < n; i++) {
for (j = 0; j < n; j++) {
graph[i][j] = INF;
}
}
// 输入边权值
for (i = 0; i < m; i++) {
scanf("%d%d%d", &u, &v, &w);
graph[u][v] = graph[v][u] = w;
}
int ans = prim(n);
printf("%d\n", ans);
return 0;
}
```
以上代码中,`graph` 存储了图的邻接矩阵,`d` 存储了每个节点到已选节点集合的最小距离,`visited` 判断每个节点是否已经加入最小生成树。`prim` 函数实现了Prim算法的主体部分。在 `main` 函数中,首先输入了节点个数和边数,然后初始化了图,并输入了边权值。最后调用 `prim` 函数求解最小生成树的总权值,并输出结果。
希望以上代码能够帮助到你!
阅读全文