用c语言实现kruskal算法求最小生成树,并给出测试结果
时间: 2023-09-14 11:09:15 浏览: 120
以下是使用C语言实现Kruskal算法求解最小生成树的代码:
```c
#include <stdio.h>
#include <stdlib.h>
#define MAX 100005
struct Edge {
int u, v, w;
};
struct Edge edge[MAX];
int parent[MAX];
int cmp(const void* a, const void* b) {
return ((struct Edge*)a)->w - ((struct Edge*)b)->w;
}
int find(int x) {
if (parent[x] != x) {
parent[x] = find(parent[x]);
}
return parent[x];
}
void unionSet(int x, int y) {
parent[find(x)] = find(y);
}
int kruskal(int n, int m) {
int ans = 0, cnt = 0;
for (int i = 1; i <= n; i++) {
parent[i] = i;
}
qsort(edge, m, sizeof(struct Edge), cmp);
for (int i = 0; i < m; i++) {
int u = edge[i].u, v = edge[i].v, w = edge[i].w;
if (find(u) != find(v)) {
unionSet(u, v);
ans += w;
cnt++;
if (cnt == n - 1) {
break;
}
}
}
return ans;
}
int main() {
int n, m;
scanf("%d%d", &n, &m);
for (int i = 0; i < m; i++) {
scanf("%d%d%d", &edge[i].u, &edge[i].v, &edge[i].w);
}
printf("%d\n", kruskal(n, m));
return 0;
}
```
其中,`edge[i].u`、`edge[i].v`、`edge[i].w` 分别表示第 i 条边的起点、终点和边权。`n` 表示图中点的个数,`m` 表示边的个数。
下面给出一个测试样例:
输入:
```
5 7
1 2 3
1 3 4
2 3 2
2 4 1
3 4 5
3 5 6
4 5 4
```
输出:
```
10
```
该测试样例表示一个带权无向图,共有 5 个点和 7 条边。使用 Kruskal 算法求解该图的最小生成树,输出最小生成树的边权之和,即 10。
注意:上述代码仅为 Kruskal 算法的实现,如果需要输出最小生成树的具体边集,还需要进行修改。
阅读全文