社区讨论

WA #7 #8 求助

P8074 [COCI 2009/2010 #7] SVEMIR参与者 3已保存回复 2

讨论操作

快速查看讨论及其快照的属性,并进行相关操作。

当前回复
2 条
当前快照
1 份
快照标识符
@lx4kjo0h
此快照首次捕获于
2024/06/07 18:53
2 年前
此快照最后确认于
2024/06/07 21:27
2 年前
查看原帖
CPP
#include<bits/stdc++.h>
using namespace std;
const int N=5e6+10;
int n,t;
int p[N];
struct Re{
	int u,v,w;
}s[N];
struct re{
	int x,y,z,num;
}a[N];
bool cmp(re x,re y){return x.x<y.x;}
	
bool cmp1(re x,re y){return x.y<y.y;} 
	
bool cmp2(re x,re y){return x.z<y.z;} 
	
bool kkk(Re x,Re y){return x.w<y.w;} 
	
int find(int x){
	if(p[x]!=x) p[x]=find(p[x]);
	return p[x];
}

void add(int u,int v,int w){s[++t].u=u,s[t].v=v,s[t].w=w;}

void Input(){
	cin>>n;
	for(int i=1;i<=n;i++){
		int u,b,c;
		cin>>u>>b>>c;
		a[i]={u,b,c,i};
	}
}

void Make(){
	sort(a+1,a+1+n,cmp);
	for(int i=1;i<n;i++) add(a[i].num,a[i+1].num,a[i+1].x-a[i].x);
	sort(a+1,a+1+n,cmp1);
	for(int i=1;i<n;i++) add(a[i].num,a[i+1].num,a[i+1].y-a[i].y);
	sort(a+1,a+1+n,cmp2);
	for(int i=1;i<n;i++) add(a[i].num,a[i+1].num,a[i+1].z-a[i].z);
}

int Kruskal(){
	for(int i=1;i<=n;i++) p[i]=i;
	sort(s,s+t+1,kkk);
	int res=0,cnt=0;
	for(int i=1;i<=t;i++){
		int u=s[i].u,v=s[i].v,w=s[i].w;
		u=find(u),v=find(v);
		if(u!=v){
			res+=w;
			cnt++;
			p[v]=u;
		}
		//if(cnt==n-1) break;
	}
	return res;
}

int main(){
	Input();
	
	Make();
	
	cout<<Kruskal();
	return 0;
}

回复

2 条回复,欢迎继续交流。

正在加载回复...