[ create a new paste ] login | about

Link: http://codepad.org/wMzI0oc4    [ raw code | fork ]

C++, pasted on Apr 1:
#include <cstdio>
#include <algorithm>
#include <utility>
#include <vector>
using namespace std;
typedef pair<int,int> pi;
 
struct disj{
    int pa[100005], r[100005];
    void init(int n){
        for (int i=1; i<=n; i++) pa[i] = i;
    }
    int find(int x){
        if(pa[x] == x) return x;
        return pa[x] = find(pa[x]);
    }
    bool uni(int p, int q){
        p = find(p);
        q = find(q);
        if(p == q) return 0;
        pa[q] = p;
        return 1;
    }
}disj;
 
struct edg{int x,s,e;}a[300005];
bool cmp(edg a, edg b){return a.x < b.x;}
 
vector<pi> lx, ly, lz;
 
int n;
 
int main(){
    scanf("%d",&n);
    for (int i=0; i<n; i++) {
        int x,y,z;
        scanf("%d %d %d",&x,&y,&z);
        lx.push_back(pi(x,i+1));
        ly.push_back(pi(y,i+1));
        lz.push_back(pi(z,i+1));
    }
    sort(lx.begin(),lx.end());
    sort(ly.begin(),ly.end());
    sort(lz.begin(),lz.end());
    for (int i=0; i<n-1; i++) {
        a[3*i] = (edg){lx[i+1].first - lx[i].first,lx[i].second,lx[i+1].second};
        a[3*i+1] = (edg){ly[i+1].first - ly[i].first,ly[i].second,ly[i+1].second};
        a[3*i+2] = (edg){lz[i+1].first - lz[i].first,lz[i].second,lz[i+1].second};
    }
    long long ret = 0;
    sort(a,a+3*n-3,cmp);
    disj.init(n);
    for (int i=0; i<3*n-3; i++) {
        if(disj.uni(a[i].s,a[i].e)){
            ret += a[i].x;
        }
    }
    printf("%lld\n",ret);
}


Create a new paste based on this one


Comments: