洛谷 P2212 [USACO14MAR]浇地Watering the Fields

传送门

题解:计算欧几里得距离,Krusal加入边权大于等于c的边,统计最后树的边权和。

代码:

#include<iostream>
#include<cstdio>
#include<cstring>
#include<algorithm>
#define maxn 2009
using namespace std;

int n,c,cnt,tot,ans;
int xi[maxn],yi[maxn],fa[maxn];

struct Edge{
    int x,y,z;
}e[maxn*maxn];

bool cmp(Edge a,Edge b){
    return a.z<b.z;
}

int f(int x){
    return fa[x]==x?x:fa[x]=f(fa[x]);
}

int dis(int i,int j){
    return (xi[i]-xi[j])*(xi[i]-xi[j])+(yi[i]-yi[j])*(yi[i]-yi[j]);
}

int main(){
    scanf("%d%d",&n,&c);
    for(int i=1;i<=n;i++){
        fa[i]=i;
        scanf("%d%d",&xi[i],&yi[i]);
        for(int j=1;j<i;j++){
            e[++cnt].x=i;e[cnt].y=j;e[cnt].z=dis(i,j);
        }
    }
    sort(e+1,e+cnt+1,cmp);
    for(int i=1;i<=cnt;i++){
        if(e[i].z<c)continue;
        int fx=f(e[i].x),fy=f(e[i].y);
        if(fx!=fy){
            tot++;
            fa[fx]=fy;
            ans+=e[i].z;
            if(tot==n-1)break;
        }
    }
    if(tot==n-1)
    printf("%d
",ans);
    else puts("-1");
    return 0;
}
AC
原文地址:https://www.cnblogs.com/zzyh/p/7708374.html