克鲁斯卡尔算法c语言完整源代码
时间: 2023-10-12 18:10:30 浏览: 109
克鲁斯卡尔算法.rar
克鲁斯卡尔算法是求解最小生成树的一种经典算法,下面是使用C语言实现的完整源代码。
```
#include <stdio.h>
#include <stdlib.h>
#include <string.h>
#define MAX_VERTEX_NUM 100 // 最大顶点数
#define MAX_EDGE_NUM (MAX_VERTEX_NUM * (MAX_VERTEX_NUM - 1) / 2) // 最大边数
#define INF 0x3fffffff // 无穷大
typedef struct {
int u, v, w; // 边的起点、终点和权值
} Edge;
int cmp(const void *a, const void *b) {
return ((Edge *)a)->w - ((Edge *)b)->w;
}
int find(int parent[], int x) {
if (parent[x] == x) {
return x;
}
return parent[x] = find(parent, parent[x]);
}
void merge(int parent[], int u, int v) {
int pu = find(parent, u);
int pv = find(parent, v);
if (pu != pv) {
parent[pu] = pv;
}
}
void kruskal(Edge edges[], int n, int m) {
int parent[MAX_VERTEX_NUM];
for (int i = 0; i < n; ++i) {
parent[i] = i;
}
qsort(edges, m, sizeof(Edge), cmp);
int count = 0;
for (int i = 0; i < m && count < n - 1; ++i) {
int u = edges[i].u, v = edges[i].v, w = edges[i].w;
if (find(parent, u) != find(parent, v)) {
printf("%d %d %d\n", u, v, w);
merge(parent, u, v);
++count;
}
}
}
int main() {
int n, m;
Edge edges[MAX_EDGE_NUM];
scanf("%d %d", &n, &m);
for (int i = 0; i < m; ++i) {
scanf("%d %d %d", &edges[i].u, &edges[i].v, &edges[i].w);
}
kruskal(edges, n, m);
return 0;
}
```
以上是克鲁斯卡尔算法的C语言完整源代码,其中使用了并查集实现集合合并,以及快速排序对边进行排序。
阅读全文