标签:mes 转换 uil using org size bool 问题 class
[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
标签:mes 转换 uil using org size bool 问题 class
原文地址:https://www.cnblogs.com/66dzb/p/11186468.html