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