题解Luogu P2212 [USACO14MAR] 浇地 Watering the Fields 最小生成树
Posted gengyf
tags:
篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了题解Luogu P2212 [USACO14MAR] 浇地 Watering the Fields 最小生成树相关的知识,希望对你有一定的参考价值。
裸的板子,判一下d和c的大小
我菜死了,kruskal写挂的原因竟然是,sort的范围错了
WA到爆了
kruskal都忘了怎么写,赶快滚去复习
code
1 #include <bits/stdc++.h> 2 using namespace std; 3 namespace gengyf 4 #define ll long long 5 const int maxn=1e6+10; 6 inline int read() 7 int x=0,f=1; 8 char c=getchar(); 9 while(c<‘0‘||c>‘9‘)if(c==‘-‘)f=-1;c=getchar(); 10 while(c>=‘0‘&&c<=‘9‘)x=(x*10)+c-‘0‘;c=getchar(); 11 return x*f; 12 13 int n,c,x[maxn],y[maxn],fa[maxn]; 14 struct edge 15 int u,v; 16 ll w; 17 e[maxn*2]; 18 int head[maxn],cnt; 19 inline void add(int u,int v,int w) 20 e[++cnt].u=u;e[cnt].v=v;e[cnt].w=w; 21 22 bool cmp(edge a,edge b) 23 return a.w<b.w; 24 25 int find(int x) 26 return x==fa[x]?x:fa[x]=find(fa[x]); 27 28 void kruskal() 29 int ans=0,tot=0; 30 for(int i=1;i<=cnt;i++) 31 int u=find(e[i].u),v=find(e[i].v); 32 if(u!=v) 33 fa[u]=v; 34 ans+=e[i].w;tot++; 35 36 if(tot==n-1)break; 37 38 if(tot==n-1)printf("%d\n",ans); 39 else puts("-1"); 40 41 int main() 42 n=read();c=read(); 43 for(int i=1;i<=n;i++) 44 x[i]=read();y[i]=read(); 45 for(int j=1;j<i;j++) 46 int d=(x[i]-x[j])*(x[i]-x[j])+(y[i]-y[j])*(y[i]-y[j]); 47 if(d>=c) 48 add(i,j,d); 49 50 51 52 sort(e+1,e+1+cnt,cmp); 53 for(int i=1;i<=n;i++)fa[i]=i; 54 kruskal(); 55 return 0; 56 57 58 signed main() 59 gengyf::main(); 60 return 0; 61
以上是关于题解Luogu P2212 [USACO14MAR] 浇地 Watering the Fields 最小生成树的主要内容,如果未能解决你的问题,请参考以下文章
P2212 [USACO14MAR]浇地Watering the Fields
luogu P2947 [USACO09MAR]向右看齐Look Up 题解
[USACO14MAR]浇地Watering the Fields