[USACO14MAR]浇地Watering the Fields
Posted 66dzb
tags:
篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了[USACO14MAR]浇地Watering the Fields相关的知识,希望对你有一定的参考价值。
[Time Gate]
https://www.luogu.org/problemnew/show/P2212
【解题思路】
刚刚A掉的一题就来写博客了,这题唯一的难点在于安装工人拒绝安装费用小于C的水管
这一点要在加边时就要判断如符合>c则加边否则不加,如果到最后判断是否>c肯定错了,因为不符合要求的水管费用不会去装,两块农田之间必然也不会有路。
【code】
1 // luogu-judger-enable-o2 2 #include <cstdio> 3 #include <cmath> 4 #include <algorithm> 5 using namespace std; 6 int n,c,cnt; 7 int ans; 8 int x[2005],y[2005],fa[2005]; 9 struct Node 10 int x; 11 int y; 12 int dis; 13 a[4000005]; 14 inline int Find(int i) 15 if(fa[i]==i)return i; 16 return fa[i]=Find(fa[i]); 17 18 inline void Union(int x,int y) 19 int f1=Find(x); 20 int f2=Find(y); 21 if(f1!=f2)fa[f1]=f2; 22 return; 23 24 inline bool cmp(Node a,Node b) 25 if(a.dis==b.dis)return a.x<b.x; 26 return a.dis<b.dis; 27 28 int main() 29 scanf("%d%d",&n,&c); 30 for(register int i=1;i<=n;i++) 31 fa[i]=i; 32 for(register int i=1;i<=n;i++) 33 scanf("%d%d",&x[i],&y[i]); 34 for(register int i=1;i<=n;i++) 35 for(register int j=i+1;j<=n;j++) 36 if((x[i]-x[j])*(x[i]-x[j])+(y[i]-y[j])*(y[i]-y[j])>=c) 37 a[++cnt].x=i; 38 a[cnt].y=j; 39 a[cnt].dis=(x[i]-x[j])*(x[i]-x[j])+(y[i]-y[j])*(y[i]-y[j]); 40 41 42 int k=0; 43 sort(a+1,a+cnt+1,cmp); 44 for(register int i=1;i<=cnt;i++) 45 if(Find(a[i].x)!=Find(a[i].y)) 46 Union(a[i].x,a[i].y); 47 ans+=a[i].dis; 48 k++; 49 50 if(k==n-1)break; 51 52 if(k==n-1&&ans>=c)printf("%d\n",ans); 53 else printf("-1\n"); 54 return 0; 55
以上是关于[USACO14MAR]浇地Watering the Fields的主要内容,如果未能解决你的问题,请参考以下文章
P2212 [USACO14MAR]浇地Watering the Fields
$P2212 [USACO14MAR]浇地Watering the Fields$
[USACO14MAR]浇地Watering the Fields
题解Luogu P2212 [USACO14MAR] 浇地 Watering the Fields 最小生成树