用克鲁斯卡尔算法c语言设计函数
时间: 2023-09-22 09:08:29 浏览: 104
以下是一个用 C 语言实现的克鲁斯卡尔算法的函数:
```c
#include <stdio.h>
#include <stdlib.h>
#define MAX_VERTEX_NUM 100 // 最大顶点数
typedef struct {
int u, v; // 边的两个顶点
int w; // 边的权值
} Edge;
int cmp(const void *a, const void *b) {
return (*(Edge *)a).w - (*(Edge *)b).w;
}
int find(int parent[], int i) {
while (parent[i] != i) {
i = parent[i];
}
return i;
}
void unionSet(int parent[], int rank[], int x, int y) {
int xroot = find(parent, x);
int yroot = find(parent, y);
if (rank[xroot] < rank[yroot]) {
parent[xroot] = yroot;
} else if (rank[xroot] > rank[yroot]) {
parent[yroot] = xroot;
} else {
parent[yroot] = xroot;
rank[xroot]++;
}
}
void kruskal(int n, Edge edges[], int m) {
int parent[MAX_VERTEX_NUM];
int rank[MAX_VERTEX_NUM];
int i, j;
for (i = 0; i < n; i++) {
parent[i] = i;
rank[i] = 0;
}
qsort(edges, m, sizeof(Edge), cmp);
printf("最小生成树的边:\n");
for (i = 0, j = 0; i < n - 1 && j < m; j++) {
int u = edges[j].u;
int v = edges[j].v;
int w = edges[j].w;
int x = find(parent, u);
int y = find(parent, v);
if (x != y) {
printf("%d - %d (%d)\n", u, v, w);
i++;
unionSet(parent, rank, x, y);
}
}
}
int main() {
int n, m, i;
Edge edges[MAX_VERTEX_NUM * MAX_VERTEX_NUM / 2];
printf("请输入顶点数和边数:\n");
scanf("%d %d", &n, &m);
printf("请输入每条边的两个顶点和权值:\n");
for (i = 0; i < m; i++) {
scanf("%d %d %d", &edges[i].u, &edges[i].v, &edges[i].w);
}
kruskal(n, edges, m);
return 0;
}
```
该函数接受三个参数:顶点数 `n`、边数组 `edges` 和边数 `m`。其中,边数组 `edges` 包含所有边的信息(顶点和权值),并且按照权值从小到大排序。函数执行过程中,使用并查集维护连通性,并按照克鲁斯卡尔算法的规则选取边。最后输出最小生成树的所有边。
阅读全文