标签:span == space += problem void reg The scan
[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
标签:span == space += problem void reg The scan
原文地址:https://www.cnblogs.com/66dzb/p/11186554.html