#include <cstdio>
#include <algorithm>
using namespace std;
#define MAXN 2007
int n;
struct edge {
int i, j, c;
} e[(MAXN*(MAXN+1))/2];
bool edgelt(const edge &a, const edge &b)
{
return a.c < b.c;
}
struct fuset {
int parent;
int rank;
} v[MAXN];
int vfind(int x) {
if (v[x].parent != x)
v[x].parent = vfind(v[x].parent);
return v[x].parent;
}
void vunion(int x, int y) {
x = vfind(x);
y = vfind(y);
if (x == y)
return;
if (v[x].rank < v[y].rank) {
v[x].parent = y;
} else if (v[x].rank > v[y].rank) {
v[y].parent = x;
} else {
v[y].parent = x;
v[x].rank++;
}
}
int main()
{
int i, j, k;
long long res;
scanf("%d", &n);
k = 0;
for (i = 0; i < n; i++)
for (j = i; j < n; j++) {
scanf("%d", &e[k].c);
e[k].i = i;
e[k].j = j+1;
k++;
}
sort(e, e + k, edgelt);
res = 0;
k = 0;
for (i = 0; i <= n; i++) {
v[i].parent = i;
v[i].rank = 0;
}
for (i = 0; k < n; i++) {
if (vfind(e[i].i) != vfind(e[i].j)) {
res += (long long) e[i].c;
vunion(e[i].i, e[i].j);
k++;
}
}
printf("%lld\n", res);
return 0;
}
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46 47 48 49 50 51 52 53 54 55 56 57 58 59 60 61 62 63 64 65 66 67 68 69 70 71 72 73 74 | #include <cstdio> #include <algorithm> using namespace std; #define MAXN 2007 int n; struct edge { int i, j, c; } e[(MAXN*(MAXN+1))/2]; bool edgelt(const edge &a, const edge &b) { return a.c < b.c; } struct fuset { int parent; int rank; } v[MAXN]; int vfind(int x) { if (v[x].parent != x) v[x].parent = vfind(v[x].parent); return v[x].parent; } void vunion(int x, int y) { x = vfind(x); y = vfind(y); if (x == y) return; if (v[x].rank < v[y].rank) { v[x].parent = y; } else if (v[x].rank > v[y].rank) { v[y].parent = x; } else { v[y].parent = x; v[x].rank++; } } int main() { int i, j, k; long long res; scanf("%d", &n); k = 0; for (i = 0; i < n; i++) for (j = i; j < n; j++) { scanf("%d", &e[k].c); e[k].i = i; e[k].j = j+1; k++; } sort(e, e + k, edgelt); res = 0; k = 0; for (i = 0; i <= n; i++) { v[i].parent = i; v[i].rank = 0; } for (i = 0; k < n; i++) { if (vfind(e[i].i) != vfind(e[i].j)) { res += (long long) e[i].c; vunion(e[i].i, e[i].j); k++; } } printf("%lld\n", res); return 0; } |
English