BZOJ 1626 Usaco2007 Dec Building Roads 修建道路

Posted zhangenming

tags:

篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了BZOJ 1626 Usaco2007 Dec Building Roads 修建道路相关的知识,希望对你有一定的参考价值。

1626: [Usaco2007 Dec]Building Roads 修建道路

Time Limit: 5 Sec  Memory Limit: 64 MB
Submit: 1802  Solved: 764
[Submit][Status][Discuss]

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

Silver

赤裸裸的kruskal

技术分享图片
 1 #include <bits/stdc++.h>
 2 #define ll long long
 3 #define inf 1000000
 4 #define eps 1e-7
 5 using namespace std;
 6 inline int read(){
 7     int x=0;int f=1;char ch=getchar();
 8     while(!isdigit(ch)) {if(ch==-) f=-1;ch=getchar();}
 9     while(isdigit(ch)) {x=x*10+ch-0;ch=getchar();}
10     return x*f;
11 }
12 const int MAXN=1e6+10;
13 struct node{
14     int x,y;
15     double v;
16 }e[MAXN];
17 int f[MAXN],cnt,x[MAXN],y[MAXN];
18 double ans;
19 inline int find(int x){
20     return x==f[x]?x:f[x]=find(f[x]);
21 }
22 inline bool mycmp(node n,node m){
23     return n.v<m.v;
24 }
25 int main(){
26     int n=read();int m=read();
27     for(int i=1;i<=n;i++){
28         x[i]=read();y[i]=read();f[i]=i;
29     }
30     for(int i=1;i<=m;i++){
31         e[++cnt].x=read();e[cnt].y=read();e[cnt].v=0;
32     }
33     for(int i=1;i<=n;i++){
34         for(int j=i+1;j<=n;j++){
35             e[++cnt].x=i;e[cnt].y=j;e[cnt].v=sqrt(1.0*(x[i]-x[j])*(x[i]-x[j])+1.0*(y[i]-y[j])*(y[i]-y[j]));
36         }
37     }
38     sort(e+1,e+cnt+1,mycmp);
39     for(int i=1;i<=cnt;i++){
40         int fx=find(e[i].x);int fy=find(e[i].y);
41         if(fx!=fy){
42             ans+=e[i].v;
43             f[fx]=fy;
44         }
45     }
46     printf("%.2lf",ans);
47     return 0; 
48 }
View Code

 
























以上是关于BZOJ 1626 Usaco2007 Dec Building Roads 修建道路的主要内容,如果未能解决你的问题,请参考以下文章

BZOJ 1626 [Usaco2007 Dec]Building Roads 修建道路:kruskal(最小生成树)

[BZOJ1626][Usaco2007 Dec]Building Roads 修建道路

bzoj 1626: [Usaco2007 Dec]Building Roads 修建道路 -- 最小生成树

BZOJ 1626: [Usaco2007 Dec]Building Roads

bzoj 1626: [Usaco2007 Dec]Building Roads 修建道路最小生成树

bzoj1626 / P2872 [USACO07DEC]道路建设Building Roads