#include <cstdio>
#include <vector>
#include <algorithm>
using namespace std;
int parent[ 2005 ];
int find( int a ){
if (parent[a] == a){
return a;
}
else {
parent[a] = find( parent[a] );
return parent[a];
}
}
void _union(int a, int b){
a = find( a );
b = find( b );
parent[ a ] = b;
}
vector < pair < int, pair <int,int> > > kr;
int main(){
int n;
scanf("%d",&n);
for (int i = 1; i <= n; i++){
parent[i] = i;
for (int j = i; j <= n; j++){
int a;
scanf("%d",&a);
kr.push_back( make_pair( a, make_pair( i-1, j )));
}
}
sort( kr.begin(), kr.end() );
long long result = 0;
for (int i = 0; i < kr.size(); i++){
if (find( kr[i].second.first ) != find( kr[i].second.second )){
_union( kr[i].second.first, kr[i].second.second );
result += kr[i].first;
}
}
printf("%lld\n", result);
}
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 | #include <cstdio> #include <vector> #include <algorithm> using namespace std; int parent[ 2005 ]; int find( int a ){ if (parent[a] == a){ return a; } else { parent[a] = find( parent[a] ); return parent[a]; } } void _union(int a, int b){ a = find( a ); b = find( b ); parent[ a ] = b; } vector < pair < int, pair <int,int> > > kr; int main(){ int n; scanf("%d",&n); for (int i = 1; i <= n; i++){ parent[i] = i; for (int j = i; j <= n; j++){ int a; scanf("%d",&a); kr.push_back( make_pair( a, make_pair( i-1, j ))); } } sort( kr.begin(), kr.end() ); long long result = 0; for (int i = 0; i < kr.size(); i++){ if (find( kr[i].second.first ) != find( kr[i].second.second )){ _union( kr[i].second.first, kr[i].second.second ); result += kr[i].first; } } printf("%lld\n", result); } |
English