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

 

以上是关于题解Luogu P2212 [USACO14MAR] 浇地 Watering the Fields 最小生成树的主要内容,如果未能解决你的问题,请参考以下文章

P2212 [USACO14MAR]浇地Watering the Fields

luogu P2947 [USACO09MAR]向右看齐Look Up 题解

[USACO14MAR]浇地Watering the Fields

洛谷3258:[USACO2012 MAR]Flowerpot 花盆——题解

洛谷2115 [USACO14MAR]破坏Sabotage

[USACO14MAR]浇地Watering the Fields