求助大佬 20分
查看原帖
求助大佬 20分
660708
llwarll楼主2022/7/7 09:05

8074

#include<bits/stdc++.h>
using namespace std;
int n,t,fa[100010],num,ans;
struct rec{
	int x,y,z,opt;
}a[100010];
struct node{
	int x1,y1,w;
}edge[1000010];
bool cmpw(node a,node b){
	return a.w<b.w;
}
bool cmpx(rec a,rec b){
	return a.x<b.x;
}
bool cmpy(rec a,rec b){
	return a.y<b.y;
}
bool cmpz(rec a,rec b){
	return a.z<b.z;
}
int get(int x){
	if(x==fa[x])return x;
	return x=get(fa[x]);
}
void add(int x,int y,int w){
	edge[++num].x1=x;
	edge[num].y1=y;
	edge[num].w=w;
}
void curuscl(){
	for(int i=1;i<=n;i++)fa[i]=i;
	int k=0;
	sort(edge+1,edge+num+1,cmpw);
	for(int i=1;i<=n;i++){
		int x=get(edge[i].x1),y=get(edge[i].y1);
		if(x!=y){
			fa[x]=y;
			ans+=edge[i].w;
			k++;
		}
		if(k==n-1)
			return; 
	}
}
int main(){
	cin>>n;
	for(int i=1;i<=n;i++){
		cin>>a[i].x>>a[i].y>>a[i].z;
		a[i].opt=i;
	}
	sort(a+1,a+1+n,cmpx);
	for(int i=1;i<=n-1;i++)
	 	add(a[i].opt,a[i+1].opt,a[i+1].x-a[i].x); 
	sort(a+1,a+1+n,cmpy);
	for(int i=1;i<=n-1;i++)
	 	add(a[i].opt,a[i+1].opt,a[i+1].y-a[i].y); 
	sort(a+1,a+1+n,cmpz);
	for(int i=1;i<=n-1;i++)
	 	add(a[i].opt,a[i+1].opt,a[i+1].z-a[i].z); 
	curuscl();
	cout<<ans;
	return 0;
}
2022/7/7 09:05
加载中...