#include<stdio.h> #include<iostream> #include<stdlib.h> #include<vector> #include<list> #include<math.h> #include<algorithm> #include<string> #include<set> #include<queue> #define limit 4048576 #define inf 9223372036854775807ll #define iinf 2147483647 #define mp make_pair #define pb push_back #define rep(i,k,n) for(int i=k;i<n;i++) using namespace std; int id[limit],treesz[limit],n,temp; priority_queue< pair<int, pair<int,int> >, vector< pair<int, pair<int,int> > >, greater<pair<int, pair<int,int> > > > c; int anc(int u){ while(id[u]!=u){ id[u]=id[id[u]]; u=id[u]; } return u; } void uunion(int u, int v){ u=anc(u); v=anc(v); if(u!=v){ if(treesz[u]>treesz[v]){ id[v]=u; treesz[u]+=treesz[v]; } else{ id[u]=v; treesz[v]+=treesz[u]; } } } int main(){ scanf("%d",&n); rep(i,0,n) rep(j,i+1,n+1){ scanf("%d",&temp); c.push(mp(temp,mp(i,j))); } long long ans=0; rep(i,0,n+1) id[i]=i; while(c.size()){ if(anc(c.top().second.first)!=anc(c.top().second.second)){ ans+=c.top().first; uunion(c.top().second.first,c.top().second.second); } c.pop(); } printf("%lld",ans); 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 | #include<stdio.h> #include<iostream> #include<stdlib.h> #include<vector> #include<list> #include<math.h> #include<algorithm> #include<string> #include<set> #include<queue> #define limit 4048576 #define inf 9223372036854775807ll #define iinf 2147483647 #define mp make_pair #define pb push_back #define rep(i,k,n) for(int i=k;i<n;i++) using namespace std; int id[limit],treesz[limit],n,temp; priority_queue< pair<int, pair<int,int> >, vector< pair<int, pair<int,int> > >, greater<pair<int, pair<int,int> > > > c; int anc(int u){ while(id[u]!=u){ id[u]=id[id[u]]; u=id[u]; } return u; } void uunion(int u, int v){ u=anc(u); v=anc(v); if(u!=v){ if(treesz[u]>treesz[v]){ id[v]=u; treesz[u]+=treesz[v]; } else{ id[u]=v; treesz[v]+=treesz[u]; } } } int main(){ scanf("%d",&n); rep(i,0,n) rep(j,i+1,n+1){ scanf("%d",&temp); c.push(mp(temp,mp(i,j))); } long long ans=0; rep(i,0,n+1) id[i]=i; while(c.size()){ if(anc(c.top().second.first)!=anc(c.top().second.second)){ ans+=c.top().first; uunion(c.top().second.first,c.top().second.second); } c.pop(); } printf("%lld",ans); return 0; } |