#include<cstdio>
#include<algorithm>
#include<vector>
#include<iostream>
#include<cmath>
using namespace std;
typedef long long LL;
const int N = 2e3+77;
int c[N][N];
int n;
int p[N];
struct edge {
int v,w,cost;
edge(int a,int b,int c) {
v = a, w = b, cost = c;
}
};
vector<edge> worek;
bool operator < (edge a, edge b) {
if(a.cost == b.cost) {
if(a.v == b.v)
return a.w < b.w;
else
return a.v < b.v;
} else
return a.cost < b.cost;
}
void wczytaj() {
scanf("%d", &n);
for(int i=1;i<=n;i++)
for(int j=i;j<=n;j++) {
scanf("%d", &c[i][j+1]);
worek.push_back(edge(i,j+1,c[i][j+1]));
}
sort(worek.begin(), worek.end());
n++;
for(int i=1;i<=n;i++)
p[i] = i;
}
int FIND(int v) {
if(p[v] != v)
p[v] = FIND(p[v]);
return p[v];
}
void UN(int v, int w) {
v = FIND(v);
w = FIND(w);
if(v != w) p[v] = w;
}
LL jebaj() {
LL res = 0;
for(int i=0;i<(int)worek.size();i++)
if (FIND(worek[i].v) != FIND(worek[i].w)) {
UN(worek[i].v, worek[i].w);
res += worek[i].cost;
}
return res;
}
int main () {
wczytaj();
printf("%lld", jebaj());
}
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 75 | #include<cstdio> #include<algorithm> #include<vector> #include<iostream> #include<cmath> using namespace std; typedef long long LL; const int N = 2e3+77; int c[N][N]; int n; int p[N]; struct edge { int v,w,cost; edge(int a,int b,int c) { v = a, w = b, cost = c; } }; vector<edge> worek; bool operator < (edge a, edge b) { if(a.cost == b.cost) { if(a.v == b.v) return a.w < b.w; else return a.v < b.v; } else return a.cost < b.cost; } void wczytaj() { scanf("%d", &n); for(int i=1;i<=n;i++) for(int j=i;j<=n;j++) { scanf("%d", &c[i][j+1]); worek.push_back(edge(i,j+1,c[i][j+1])); } sort(worek.begin(), worek.end()); n++; for(int i=1;i<=n;i++) p[i] = i; } int FIND(int v) { if(p[v] != v) p[v] = FIND(p[v]); return p[v]; } void UN(int v, int w) { v = FIND(v); w = FIND(w); if(v != w) p[v] = w; } LL jebaj() { LL res = 0; for(int i=0;i<(int)worek.size();i++) if (FIND(worek[i].v) != FIND(worek[i].w)) { UN(worek[i].v, worek[i].w); res += worek[i].cost; } return res; } int main () { wczytaj(); printf("%lld", jebaj()); } |
English