社区讨论
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 条回复,欢迎继续交流。
正在加载回复...