20pts求助
查看原帖
20pts求助
1183074
xzy_AK_IOI楼主2024/8/7 20:13
#include<bits/stdc++.h>
using namespace std;
const int N=3e5+10;
int n,m;
int dis(int x,int y,int z,int x2,int y2,int z2){
	return min(abs(x-x2),min(abs(y-y2),abs(z-z2)));
}
struct planet{
	int x,y,z,id;
}p[N];
struct edge{
	int from;
	int to;
	int w;
}e[N];
bool cmpx(planet a,planet b){
	return a.x<b.x;
}
bool cmpy(planet a,planet b){
	return a.y<b.y;
}
bool cmpz(planet a,planet b){
	return a.z<b.z;
}
bool cmp(edge a,edge b){
	return a.w<b.w;
}
int s[N];
int find_set(int x){
	if (x!=s[x]){
		s[x]=find_set(s[x]);
	}
	return s[x];
}
void Kruskal(){
	sort(e+1,e+1+m,cmp);
	for (int i=1;i<=n;i++) s[i]=i;
	int ans=0;
	for (int i=1;i<=m;i++){
		int e1=find_set(e[i].from);
		int e2=find_set(e[i].to);
		if (e1==e2) continue;
		ans+=e[i].w;
		s[e1]=e2;
	}
	cout<<ans;
}
signed main()
{
	ios::sync_with_stdio(0);
	cin.tie(0);
	cin>>n;
	for (int i=1;i<=n;i++){
		cin>>p[i].x>>p[i].y>>p[i].z;
		p[i].id=i;
	}
	sort(p+1,p+1+n,cmpx);
	for (int i=1;i<=n-1;i++){
		m++;
		e[i]=(edge){p[i].id,p[i+1].id,dis(p[i].x,p[i].y,p[i].z,p[i+1].x,p[i+1].y,p[i+1].z)};
	}
	sort(p+1,p+1+n,cmpy);
	for (int i=1;i<=n-1;i++){
		m++;
		e[i]=(edge){p[i].id,p[i+1].id,dis(p[i].x,p[i].y,p[i].z,p[i+1].x,p[i+1].y,p[i+1].z)};
	}
	sort(p+1,p+1+n,cmpz);
	for (int i=1;i<=n-1;i++){
		m++;
		e[i]=(edge){p[i].id,p[i+1].id,dis(p[i].x,p[i].y,p[i].z,p[i+1].x,p[i+1].y,p[i+1].z)};
	}
	Kruskal();
	return 0;
}
2024/8/7 20:13
加载中...