文章

33

粉丝

0

获赞

85

访问

2.2k

头像
最小生成树 题解:Kruskal 并查集实现 C语言
P1611 中山大学机试题
发布于2026年3月20日 19:26
阅读数 31

#include <stdio.h>
#include <stdlib.h>

struct Edge {
    int u, v, w;
};

int cmp(const void *a, const void *b) {
    return ((struct Edge *)a)->w - ((struct Edge *)b)->w;
}

#define MAXN 5050
#define MAXM 200050

struct Edge edges[MAXM];
int fa[MAXN];
int n, m;

int find(int x) {
    return fa[x] == x ? x : (fa[x] = find(fa[x]));
}//注意这里一个路径压缩 fa[x]==find(fa[x]).

int unite(int x, int y) {
    int fx = find(x);
    int fy = find(y);
    if (fx == fy) return 0;//同一个父节点,合并失败
    else {
        fa[fx] = fy;	//fx合并到fy
    }
    return 1;
}

int kruskal() {//返回最小生成树各边的长度之和
	//先初始化并查集,然后通过并查集的特性来判断回路
	//如果存在回路,那么跳过

    for (int i = 1; i <= n; i++) {
        fa[i] = i;
    }
    int count = 0;
    int cnt = 0;

    qsort(edges, m, sizeof(struct Edge), cmp);

    for (int i = 0; i < m; i++) {
        int u = edges[i].u;
        int v = edges[i].v;
        int w = edges[i].w;

        if (find(u) == find(v)) {
   ...
登录查看完整内容


登录后发布评论

暂无评论,来抢沙发