简介
对最小生成树Kruskal算法的一个复习回顾,借助并查集实现
代码示例
#include <bits/stdc++.h>
using namespace std;
const int MAXN = 10000;
int tag[MAXN];
int par[MAXN];
struct Arc {
int u, v, w;
Arc(): u (0), v (0), w (0) {}
} Arcs[MAXN];
int Find (int x) {
int s;
for (s = x; par[s] >= 0; s = par[s]) {}
while (s != x) {
int t = par[x];
par[x] = s;
x = t;
}
return s;
}
void Union (int x, int y) {
int u = Find (x);
int v = Find (y);
int sum = u + v;
if (par[u] < par[v]) {
par[u] = sum;
par[v] = u;
} else {
par[v] = sum;
par[u] = v;
}
}
int main() {
memset (tag, 0, sizeof (par));
memset (par, -1, sizeof (par));
int N, M, u, v, w;
scanf ("%d %d", &N, &M);
for (int i = 0; i < M; ++i) {
scanf ("%d %d %d", &u, &v, &w);
}
sort (Arcs, Arcs + M,
[] (const Arc & a1, const Arc & a2) {
return a1.w < a2.w;
});
int sum = 0;
int num = 0;
for (int i = 0; i < M; ++i) {
u = Arcs[i].u;
v = Arcs[i].v;
w = Arcs[i].w;
if (Find (u) != Find (v)) {
sum += w;
Union (u, v);
++num;
}
if (num >= N - 1) {
break;
}
}
printf ("%d\n", sum);
return 0;
}