zoukankan      html  css  js  c++  java
  • BZOJ——1626: [Usaco2007 Dec]Building Roads 修建道路

    http://www.lydsy.com/JudgeOnline/problem.php?id=1626

    Time Limit: 5 Sec  Memory Limit: 64 MB
    Submit: 1787  Solved: 755
    [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

     1 #include <algorithm>
     2 #include <cstdio>
     3 #include <cmath>
     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)const
    18     {
    19         return dis<x.dis;
    20     }
    21 }road[N*N>>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){;}
    ——每当你想要放弃的时候,就想想是为了什么才一路坚持到现在。
  • 相关阅读:
    Grunt VS Gulp
    Gulp开发教程(翻译)
    JavaScript的ajax使用
    移动端交互手势详解及实现
    JavaScript获取页面宽度高度
    JavaScript中的this(你不知道的JavaScript)
    前端Web开发MVC模式-入门示例
    RequireJS实例分析
    JavaScript 模块化历程
    LABjs、RequireJS、SeaJS 哪个最好用?为什么?- 玉伯的回答
  • 原文地址:https://www.cnblogs.com/Shy-key/p/7741176.html
Copyright © 2011-2022 走看看