信息
- ID
- 1336
- 时间
- 2000ms
- 内存
- 128MiB
- 难度
- 9
- 标签
- 递交数
- 175
- 已通过
- 19
- 上传者
备注:
******************************************/
#include <queue>
#include <math.h>
#include <stack>
#include <stdio.h>
#include <iostream>
#include <vector>
#include <iomanip>
#include <string.h>
#include <algorithm>
#include <map>
using namespace std;
#define int long long
const int N = 1e6 + 10;
const int INF = 0x3f3f3f3f;
struct node{
int x, y, v;
}b[1000100];
int ans, n, pre[1000100], root1, root2, t;
struct gjl{
int x, y, z, v;
}jb[2000100];
bool cmp(node aa, node bb)
{
return aa.v < bb.v;
}
bool cmpx(gjl xx, gjl yy)
{
return xx.x < yy.x;
}
bool cmpy(gjl xx, gjl yy)
{
return xx.y < yy.y;
}
bool cmpz(gjl xx, gjl yy)
{
return xx.z < yy.z;
}
int unionsearch(int root)
{
int son, tmp;
son = root;
while(root != pre[root])
root = pre[root];
while(son != root)
{
tmp = pre[son];
pre[son] = root;
son = tmp;
}
return root;
}
signed main()
{
//freopen(".in", "r", stdin);
//freopen(".out", "w", stdout);
cin>>n;
for(int i = 1; i <= n; i++)
{
cin>>jb[i].x>>jb[i].y>>jb[i].z;
jb[i].v = i;
}
sort(jb+1, jb+1+n, cmpx);
for(int i = 2; i <= n; i++)
{
int k = jb[i].x - jb[i-1].x;
int u = jb[i-1].v;
int v = jb[i].v;
b[++t].x = v;
b[t].y = u;
b[t].v = k;
}
sort(jb+1, jb+1+n, cmpy);
for(int i = 2; i <= n; i++)
{
int k = jb[i].y - jb[i-1].y;
int u = jb[i-1].v;
int v = jb[i].v;
b[++t].x = v;
b[t].y = u;
b[t].v = k;
}
sort(jb+1, jb+1+n, cmpz);
for(int i = 2; i <= n; i++)
{
int k = jb[i].z - jb[i-1].z;
int u = jb[i-1].v;
int v = jb[i].v;
b[++t].x = v;
b[t].y = u;
b[t].v = k;
}
sort(b+1, b+1+t, cmp);
for(int i = 1; i <= n; i++)
{
pre[i] = i;
}
for(int i = 1; i <= t; i++)
{
int root1 = unionsearch(b[i].x);
int root2 = unionsearch(b[i].y);
if(root1 != root2)
{
ans += b[i].v;
pre[root2] = root1;
}
}
cout<<ans;
return 0;
}