zoukankan      html  css  js  c++  java
  • 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

    #include <bits/stdc++.h>
    #define ll long long
    #define inf 1000000
    #define eps 1e-7
    using namespace std;
    inline int read(){
        int x=0;int f=1;char ch=getchar();
        while(!isdigit(ch)) {if(ch=='-') f=-1;ch=getchar();}
        while(isdigit(ch)) {x=x*10+ch-'0';ch=getchar();}
        return x*f;
    }
    const int MAXN=1e6+10;
    struct node{
        int x,y;
        double v;
    }e[MAXN];
    int f[MAXN],cnt,x[MAXN],y[MAXN];
    double ans;
    inline int find(int x){
        return x==f[x]?x:f[x]=find(f[x]);
    }
    inline bool mycmp(node n,node m){
        return n.v<m.v;
    }
    int main(){
        int n=read();int m=read();
        for(int i=1;i<=n;i++){
            x[i]=read();y[i]=read();f[i]=i;
        }
        for(int i=1;i<=m;i++){
            e[++cnt].x=read();e[cnt].y=read();e[cnt].v=0;
        }
        for(int i=1;i<=n;i++){
            for(int j=i+1;j<=n;j++){
                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]));
            }
        }
        sort(e+1,e+cnt+1,mycmp);
        for(int i=1;i<=cnt;i++){
            int fx=find(e[i].x);int fy=find(e[i].y);
            if(fx!=fy){
                ans+=e[i].v;
                f[fx]=fy;
            }
        }
        printf("%.2lf",ans);
        return 0; 
    }
    

      

  • 相关阅读:
    day7 面向对象 静态方法 类方法 属性方法 类的特殊成员方法 元类 反射 异常处理
    day6 面向对象 封装 继承 多态 类与实例在内存中的关系 经典类和新式类
    day5 time datetime random os sys shutil json pickle shelve xml configparser hashlib subprocess logging re正则 python计算器
    kafka常用操作命令
    linux基础
    django学习1——初识web应用程序
    mysql数据库(三)——pymysql模块
    mysql数据库(二)——表的查询
    mysql数据库(一)
    Python常用模块——re模块
  • 原文地址:https://www.cnblogs.com/something-for-nothing/p/8087314.html
Copyright © 2011-2022 走看看