【题解】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 }
View Code

 

posted @ 2019-10-07 11:40  喵の耳  阅读(115)  评论(0编辑  收藏  举报