#5#9#10WA
查看原帖
#5#9#10WA
637787
ILNC_Matrix楼主2023/5/17 13:24

求助大佬,70pts

#include<bits/stdc++.h>
#define int long long

using namespace std;

inline int read(){
	int x=0,f=1;
	char c=getchar();
	while(c<'0'||c>'9'){
		if(c=='-') f=-1;
		c=getchar();
	}
	while(c>='0'&&c<='9'){
		x=(x<<3)+(x<<1)+(c^48);
		c=getchar();
	}
	return x*f;
}

struct coor{
	int x,y,z,id;
	coor(){}
	coor(int a,int b,int c,int d){
		x=a,y=b,z=c,id=d;
	}
}f[100010];

bool cmpx(coor a,coor b){
	return a.x<b.x;
}

bool cmpy(coor a,coor b){
	return a.y<b.y;
}

bool cmpz(coor a,coor b){
	return a.z<b.z;
}

struct edge{
	int u,v,w;
	edge(){}
	edge(int a,int b,int c){
		u=a,v=b,w=c;
	}
	bool operator <(const edge &W) const{
		return w<W.w;
	}
}g[300010];

int n,m;
int res,cnt;
int p[100010];

int find(int x){
	if(p[x]!=x) p[x]=find(p[x]);
	return p[x];
}

void kruskal(){
	for(int i=1;i<=n;++i) p[i]=i;
	sort(g+1,g+m+1);
	for(int i=1;i<=m;++i){
		int u=g[i].u,v=g[i].v,w=g[i].w;
		u=find(u),v=find(v);
		if(u!=v){
			p[u]=v;
			res+=w;
			cnt++;
			if(cnt==n-1) break;
		}
	}
	return;
}

signed main(){
	cin>>n;
	for(int i=1;i<=n;++i){
		int x=read(),y=read(),z=read();
		f[i]=coor(x,y,z,i);
	}
	sort(f+1,f+1+n,cmpx);
	for(int i=1;i<n;++i){
		int w=abs(f[i].x-f[i+1].x);
		g[++m]=edge(f[i].id,f[i+1].id,w);
	}
	sort(f+1,f+1+n,cmpy);
	for(int i=1;i<n;++i){
		int w=abs(f[i].y-f[i+1].y);
		g[++m]=edge(f[i].id,f[i+1].id,w);
	}
	sort(f+1,f+1+n,cmpz);
	for(int i=1;i<n;++i){
		int w=abs(f[i].z-f[i+1].z);
		g[++m]=edge(f[i].id,f[i+1].id,w);
	}
	kruskal();
	cout<<res;
	return 0;
}


2023/5/17 13:24
加载中...