[USACO07DEC]道路建设Building Roads
Posted 66dzb
tags:
篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了[USACO07DEC]道路建设Building Roads相关的知识,希望对你有一定的参考价值。
[Time Gate]
https://www.luogu.org/problemnew/show/P2872
【解题思路】
一道最小生成树的基本题吧,这里要注意两点
1.数组范围要开大,毕竟是生成树,开n平方即可
2.求边上权值算两点之间距离要注意精度的问题,多强制转换几次(double)防止WA
就OK了,剩下是Kruskal模板
【code】
1 #include <cstdio> 2 #include <cmath> 3 #include <algorithm> 4 using namespace std; 5 int n,m,cnt; 6 double ans; 7 int x[1000005],y[1000005],fa[1000005]; 8 struct Node 9 int x; 10 int y; 11 double dis; 12 a[1000005]; 13 inline int Find(int i) 14 if(fa[i]==i)return i; 15 return fa[i]=Find(fa[i]); 16 17 inline void Union(int x,int y) 18 int f1=Find(x); 19 int f2=Find(y); 20 if(f1!=f2)fa[f1]=f2; 21 return; 22 23 inline bool cmp(Node a,Node b) 24 if(a.dis==b.dis)return a.x<b.x; 25 return a.dis<b.dis; 26 27 int main() 28 scanf("%d%d",&n,&m); 29 for(register int i=1;i<=n;i++) 30 fa[i]=i; 31 for(register int i=1;i<=n;i++) 32 scanf("%d%d",&x[i],&y[i]); 33 for(register int i=1;i<=n;i++) 34 for(register int j=i+1;j<=n;j++) 35 a[++cnt].x=i; 36 a[cnt].y=j; 37 a[cnt].dis=(double)sqrt((double)(x[i]-x[j])*(double)(x[i]-x[j])+(double)(y[i]-y[j])*(double)(y[i]-y[j])); 38 39 int x,y; 40 for(register int i=1;i<=m;i++) 41 scanf("%d%d",&x,&y); 42 a[++cnt].x=x; 43 a[cnt].y=y; 44 a[cnt].dis=0.0; 45 46 sort(a+1,a+cnt+1,cmp); 47 for(register int i=1;i<=cnt;i++) 48 if(Find(a[i].x)!=Find(a[i].y)) 49 Union(a[i].x,a[i].y); 50 ans+=a[i].dis; 51 52 53 printf("%.2lf\n",ans); 54 return 0; 55
以上是关于[USACO07DEC]道路建设Building Roads的主要内容,如果未能解决你的问题,请参考以下文章
[USACO07DEC]道路建设Building Roads
$P2872 [USACO07DEC]道路建设Building Roads$
[USACO07DEC]道路建设Building Roads
建造道路 (Building Roads, USACO 2007 Dec)