Krucskal代码:
void kruskal(struct Edge edges[], int n, int m) {
qsort(edges, m, sizeof(struct Edge), cmp);
for (int i = 0; i < n; i++) {
parent[i] = i;
}
int count = 0;
for (int i = 0; i < m; i++) {
struct Edge edge = edges[i];
if (find(edge.u) != find(edge.v)) {
unionSet(edge.u, edge.v);
printf("(%d, %d) ", edge.u, edge.v); // 输出构成最小生成树的边
count++;
if (count == n - 1) {
break;
}
}
}
}
最小生成树结果:
源码:
#include <stdio.h>
#include <stdlib.h>
#define MAX_VERTEX 100
int parent[MAX_VERTEX];
int find(int p) {
while (p != parent[p]) {
p = parent[p];
}
return parent[p];
}
void unionSet(int p, int q) {
int pRoot = find(p);
int qRoot = find(q);
if (pRoot == qRoot) {
return;
}
parent[pRoot] = qRoot;
}
struct Edge {
int u;
int v;
int weight;
};
int cmp(const void* a, const void* b) {
struct Edge* edgeA = (struct Edge*)a;
struct Edge* edgeB = (struct Edge*)b;
return edgeA->weight - edgeB->weight;
}
void kruskal(struct Edge edges[], int n, int m) {
qsort(edges, m, sizeof(struct Edge), cmp);
for (int i = 0; i < n; i++) {
parent[i] = i;
}
int count = 0;
for (int i = 0; i < m; i++) {
struct Edge edge = edges[i];
if (find(edge.u) != find(edge.v)) {
unionSet(edge.u, edge.v);
printf("(%d, %d) ", edge.u, edge.v); // 输出构成最小生成树的边
count++;
if (count == n - 1) {
break;
}
}
}
}
int main() {
int n, m;
printf("请输入顶点和边的数量:\n");
scanf("%d%d", &n, &m);
struct Edge* edges = (struct Edge*)malloc(m * sizeof(struct Edge));
printf("请输入边的权重:\n");
for (int i = 0; i < m; i++) {
scanf("%d%d%d", &edges[i].u, &edges[i].v, &edges[i].weight);
}
printf("最小生成树中的边:\n");
kruskal(edges, n, m);
free(edges);
return 0;
}