博客
关于我
强烈建议你试试无所不能的chatGPT,快点击我
BZOJ——1626: [Usaco2007 Dec]Building Roads 修建道路
阅读量:5136 次
发布时间:2019-06-13

本文共 2373 字,大约阅读时间需要 7 分钟。

Time Limit: 5 Sec  Memory Limit: 64 MB
Submit: 1787  Solved: 755
[][][]

Description

Farmer John最近得到了一些新的农场,他想新修一些道路使得他的所有农场可以经过原有的或是新修的道路互达(也就是说,从任一个农场都可以经过一些首尾相连道路到达剩下的所有农场)。有些农场之间原本就有道路相连。 所有N(1 <= N <= 1,000)个农场(用1..N顺次编号)在地图上都表示为坐标为(X_i, Y_i)的点(0 <= X_i <= 1,000,000;0 <= Y_i <= 1,000,000),两个农场间道路的长度自然就是代表它们的点之间的距离。现在Farmer John也告诉了你农场间原有的M(1 <= M <= 1,000)条路分别连接了哪两个农场,他希望你计算一下,为了使得所有农场连通,他所需建造道路的最小总长是多少。

Input

* 第1行: 2个用空格隔开的整数:N 和 M

 * 第2..N+1行: 第i+1行为2个用空格隔开的整数:X_i、Y_i * 第N+2..N+M+2行: 每行用2个以空格隔开的整数i、j描述了一条已有的道路, 这条道路连接了农场i和农场j

Output

* 第1行: 输出使所有农场连通所需建设道路的最小总长,保留2位小数,不必做 任何额外的取整操作。为了避免精度误差,计算农场间距离及答案时 请使用64位实型变量

Sample Input

4 1
1 1
3 1
2 3
4 3
1 4
输入说明:
FJ一共有4个坐标分别为(1,1),(3,1),(2,3),(4,3)的农场。农场1和农场
4之间原本就有道路相连。

Sample Output

4.00
输出说明:
FJ选择在农场1和农场2间建一条长度为2.00的道路,在农场3和农场4间建一
条长度为2.00的道路。这样,所建道路的总长为4.00,并且这是所有方案中道路
总长最小的一种。

HINT

 

Source

 

1 #include 
2 #include
3 #include
4 5 inline void read(int &x) 6 { 7 x=0; register char ch=getchar(); 8 for(; ch>'9'||ch<'0'; ) ch=getchar(); 9 for(; ch>='0'&&ch<='9'; ch=getchar()) x=x*10+ch-'0';10 }11 const int N(1005);12 double ans;13 int n,m,t,cnt;14 int fa[N],x[N],y[N];15 struct Road {16 int x,y;double dis;17 bool operator < (const Road&x)const18 {19 return dis
>1];22 23 inline double Get_Dis(int i,int j)24 {25 double t1=(1.*x[i]-1.*x[j])*(1.*x[i]-1.*x[j]);26 double t2=(1.*y[i]-1.*y[j])*(1.*y[i]-1.*y[j]);27 return sqrt(1.*t1+1.*t2);28 }29 30 int find(int x) { return x==fa[x]?x:fa[x]=find(fa[x]); }31 32 int Presist()33 {34 read(n),read(m);35 for(int i=1; i<=n; ++i)36 read(x[i]),read(y[i]),fa[i]=i;37 for(int u,v,i=1; i<=m; ++i)38 read(u),read(v),fa[find(v)]=find(u);39 for(int i=1; i<=n; ++i)40 for(int j=i+1; j<=n; ++j)41 {42 road[++cnt].dis=Get_Dis(i,j);43 road[cnt].x=i,road[cnt].y=j;44 }45 std::sort(road+1,road+cnt+1);46 for(int fx,fy,i=1; i<=cnt; ++i)47 {48 fx=find(road[i].x),49 fy=find(road[i].y);50 if(fx==fy) continue;51 ans+=road[i].dis; fa[fx]=fy;52 if(++t==n-1) break;53 }54 printf("%.2lf",ans);55 return 0;56 }57 58 int Aptal=Presist();59 int main(int argc,char**argv){;}

 

转载于:https://www.cnblogs.com/Shy-key/p/7741176.html

你可能感兴趣的文章
Wpf 之Canvas介绍
查看>>
linux history
查看>>
jQuery on(),live(),trigger()
查看>>
Python2.7 urlparse
查看>>
sencha touch在华为emotion ui 2.0自带浏览器中圆角溢出的bug
查看>>
【架构】Linux的架构(architecture)
查看>>
ASM 图解
查看>>
Date Picker控件:
查看>>
你的第一个Django程序
查看>>
grafana授权公司内部邮箱登录 ldap配置
查看>>
treegrid.bootstrap使用说明
查看>>
[Docker]Docker拉取,上传镜像到Harbor仓库
查看>>
javascript 浏览器类型检测
查看>>
nginx 不带www到www域名的重定向
查看>>
记录:Android中StackOverflow的问题
查看>>
导航,头部,CSS基础
查看>>
[草稿]挂载新硬盘
查看>>
[USACO 2017 Feb Gold] Tutorial
查看>>
关于mysql中GROUP_CONCAT函数的使用
查看>>
OD使用教程20 - 调试篇20
查看>>