zoukankan      html  css  js  c++  java
  • 畅通工程再续--hdu1875

    畅通工程再续

    Time Limit: 2000/1000 MS (Java/Others)    Memory Limit: 32768/32768 K (Java/Others)
    Total Submission(s): 19462    Accepted Submission(s): 6095


    Problem Description
    相信大家都听说一个“百岛湖”的地方吧,百岛湖的居民生活在不同的小岛中,当他们想去其他的小岛时都要通过划小船来实现。现在政府决定大力发展百岛湖,发展首先要解决的问题当然是交通问题,政府决定实现百岛湖的全畅通!经过考察小组RPRush对百岛湖的情况充分了解后,决定在符合条件的小岛间建上桥,所谓符合条件,就是2个小岛之间的距离不能小于10米,也不能大于1000米。当然,为了节省资金,只要求实现任意2个小岛之间有路通即可。其中桥的价格为 100元/米。
     
    Input
    输入包括多组数据。输入首先包括一个整数T(T <= 200),代表有T组数据。
    每组数据首先是一个整数C(C <= 100),代表小岛的个数,接下来是C组坐标,代表每个小岛的坐标,这些坐标都是 0 <= x, y <= 1000的整数。
     
    Output
    每组输入数据输出一行,代表建桥的最小花费,结果保留一位小数。如果无法实现工程以达到全部畅通,输出”oh!”.
     
    Sample Input
    2
    2
    10 10
    20 20
    3
    1
    1 2 2
    1000 1000
     
    Sample Output
    1414.2
    oh!
     

    这道题挺不错的,没有直接给你要结合的点,你要自己去寻找!

    我们发现,只有当这个岛屿和其他的距离在10到1000这个范围内才能结合,我们就可以让这一个岛屿和其他的全部尝试一下,符合的就先放在结构体中!

    然后就可以用最小生成树来解决了!

     1 #include<cstdio>
     2 #include<cstring>
     3 #include<algorithm>
     4 #include<cmath>
     5 using namespace std;
     6 int per[110],cot;
     7 struct node
     8 {
     9     int b,e;
    10     double w;
    11 }s[10000];//注意结构体要开大点,不然会re
    12 bool cmp(node x,node y)
    13 {
    14     return x.w<y.w;
    15 }
    16 void init()
    17 {
    18     int i;
    19     for(i=0;i<110;i++)
    20     per[i]=i;
    21 }
    22 int find(int x)
    23 {
    24     while(x!=per[x])
    25     x=per[x];
    26     return x;
    27 }
    28 bool join(int x,int y)
    29 {
    30     int fx=find(x);
    31     int fy=find(y);
    32     if(fx!=fy)
    33     {
    34         per[fx]=fy;
    35         cot++;//记录连接的边数
    36         return true;
    37     }
    38     return false;
    39 }
    40 int main()
    41 {
    42     int i,j,n,n1;
    43     double x[1010],y[1010];
    44     scanf("%d",&n);
    45     while(n--)
    46     {
    47         init();
    48         scanf("%d",&n1);
    49         for(i=0;i<n1;i++)
    50         {
    51             scanf("%lf%lf",&x[i],&y[i]);        
    52         }
    53         int k=0;
    54         for(i=0;i<n1;i++)
    55         {
    56             for(j=i;j<n1;j++)
    57             {
    58                 double q=sqrt((x[i]-x[j])*(x[i]-x[j])+(y[i]-y[j])*(y[i]-y[j]));//q来记录两岛屿的距离
    59                 if(q>=10&&q<=1000)
    60                 {
    61                     s[k].b=i;
    62                     s[k].e=j;
    63                     s[k].w=q;
    64                     k++;
    65                 }//符合要求的放在结构体中
    66 
    67             }
    68         }
    69         cot=0;
    70         sort(s,s+k,cmp);
    71         double sum=0;
    72         for(i=0;i<k;i++)
    73         {
    74             if(join(s[i].b,s[i].e))
    75             sum+=s[i].w;
    76         }
    77         if(cot!=n1-1)//如果边数不等于点数-1就不能全部连通
    78         printf("oh!
    ");
    79         else
    80         printf("%.1lf
    ",sum*100);
    81         
    82     }
    83     return 0;
    84 }
  • 相关阅读:
    无法访问局域网其他计算机
    部署好网站,同局域网中电脑无法访问的问题的解决方案
    python——模块
    python字符串实战
    python——迭代器和生成器
    python——面向对象基础
    python——文件操作
    python——面向对象相关
    python——面向对象进阶
    设计模式——单例模式
  • 原文地址:https://www.cnblogs.com/Eric-keke/p/4721077.html
Copyright © 2011-2022 走看看