#include<bits/stdc++.h>
using namespace std;
#define int long long
const int N=1e5+7;
int n,m;
struct node{
int x,y,z,w;
}cost[N];
struct node2{
int u,v,w;
}G[N*6];
int fa[N],ans;
bool cmpx(node a,node b){
return a.x<b.x;
}
bool cmpy(node a,node b){
return a.y<b.y;
}
bool cmpz(node a,node b){
return a.z<b.z;
}
bool cmpw(node2 a,node2 b){
return a.w<b.w;
}
int getfa(int u){
if(u==fa[u]) return u;
return fa[u]=getfa(fa[u]);
}
void add(int u,int v,int w){
G[++m].u=u;
G[m].v=v;
G[m].w=w;
}
void KU(){
int cnt=0;
for(int i=1;i<=m;i++){
int u=G[i].u,v=G[i].v,w=G[i].w;
u=getfa(u),v=getfa(v);
if(u!=v){
ans+=w;
cnt++;
fa[u]=v;
if(cnt==n-1) return;
}
}
}
signed main(){
ios::sync_with_stdio(0);cin.tie(0);cout.tie(0);
cin>>n;
for(int i=1;i<=n;i++) cin>>cost[i].x>>cost[i].y>>cost[i].z,cost[i].w=i;
sort(cost+1,cost+1+n,cmpx);
for(int i=1;i<n;i++){
add(cost[i].w,cost[i+1].w,cost[i+1].x-cost[i].x);
add(cost[i+1].w,cost[i].w,cost[i+1].x-cost[i].x);
}
sort(cost+1,cost+1+n,cmpy);
for(int i=1;i<n;i++){
add(cost[i].w,cost[i+1].w,cost[i+1].y-cost[i].y);
add(cost[i+1].w,cost[i].w,cost[i+1].y-cost[i].y);
}
sort(cost+1,cost+1+n,cmpz);
for(int i=1;i<n;i++){
add(cost[i].w,cost[i+1].w,cost[i+1].z-cost[i].z);
add(cost[i+1].w,cost[i].w,cost[i+1].z-cost[i].z);
}
for(int i=1;i<=n;i++) fa[i]=i;
sort(G+1,G+1+m,cmpw);
KU();
cout<<ans;
return 0;
}
在
sort(cost+1,cost+1+n,cmpx);
for(int i=1;i<n;i++){
add(cost[i].w,cost[i+1].w,cost[i+1].x-cost[i].x);
add(cost[i+1].w,cost[i].w,cost[i+1].x-cost[i].x);
}
sort(cost+1,cost+1+n,cmpy);
for(int i=1;i<n;i++){
add(cost[i].w,cost[i+1].w,cost[i+1].y-cost[i].y);
add(cost[i+1].w,cost[i].w,cost[i+1].y-cost[i].y);
}
sort(cost+1,cost+1+n,cmpz);
for(int i=1;i<n;i++){
add(cost[i].w,cost[i+1].w,cost[i+1].z-cost[i].z);
add(cost[i+1].w,cost[i].w,cost[i+1].z-cost[i].z);
}
为什么计算权值是
cost[i+1].x-cost[i].x;
cost[i+1].y-cost[i].y;
cost[i+1].z-cost[i].z;
不应该是 min{∣xA−xB∣,∣yA−yB∣,∣zA−zB∣} 吗?