您的位置:首页 > 其它

洛谷 P2212 [USACO14MAR]浇地Watering the Fields

2017-10-22 11:16 375 查看

传送门

题解:计算欧几里得距离,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\n",ans);
else puts("-1");
return 0;
}
AC

 

内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签: