文章
33
粉丝
0
获赞
85
访问
2.2k
#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)) {
...
登录后发布评论
暂无评论,来抢沙发