zoukankan      html  css  js  c++  java
  • HDU 1875 畅通工程再续 (最小生成树)

    畅通工程再续

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


    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!
     
    Author
    8600
     
    Source
     
    Recommend
    lcy
     
    最小生成树
    kruskal算法,只是这里先把坐标处理一下,然后就和HDU 1863 一样了
     1 #include<cstdio>
     2 #include<cmath>
     3 #include<cstring>
     4 #include<stdlib.h>
     5 #include<algorithm>
     6 using namespace std;
     7 const int MAXN=10000+5000;
     8 struct point
     9 {
    10     int x;
    11     int y;
    12 }po[MAXN];
    13 
    14 struct node
    15 {
    16     int star;
    17     int en;
    18     double dis;
    19     bool operator<(const node&B)const
    20     {
    21         return dis<B.dis;
    22     }
    23 }a[MAXN];
    24 int p[MAXN];
    25 int Find(int x)
    26 {
    27     return p[x]==x?x:p[x]=Find(p[x]);
    28 }
    29 
    30 double distans(int x1,int y1,int x2,int y2)
    31 {
    32     return sqrt((double)(x1-x2)*(x1-x2)+(double)(y1-y2)*(y1-y2));
    33 }
    34 
    35 int main()
    36 {
    37     //freopen("in.txt","r",stdin);
    38     int kase;
    39     scanf("%d",&kase);
    40     while(kase--)
    41     {
    42         int n,cnt=1;
    43         double ans=0;
    44         scanf("%d",&n);
    45         for(int i=1;i<=n;i++)
    46             scanf("%d %d",&po[i].x,&po[i].y);
    47         for(int i=1;i<n;i++)
    48         {
    49             for(int j=i+1;j<=n;j++)
    50             {
    51                 double temp=distans(po[i].x,po[i].y,po[j].x,po[j].y);
    52                 if(10.0<=temp&&temp<=1000.0)
    53                 {
    54                     a[cnt].star=i;
    55                     a[cnt].en=j;
    56                     a[cnt].dis=temp;
    57                     cnt++;
    58                 }
    59             }
    60         }
    61         sort(a+1,a+cnt+1);
    62         for(int i=1;i<=cnt;i++)
    63             p[i]=i;
    64         int sum=0;
    65         for(int i=1;i<=cnt;i++)
    66         {
    67             int x=Find(a[i].star);
    68             int y=Find(a[i].en);
    69             //printf("x=%d,y=%d",x,y);
    70             if(x!=y)
    71             {
    72                 p[x]=y;
    73                 ans+=a[i].dis;
    74                 sum++;
    75                 if(sum==n-1)
    76                     break;
    77             }
    78         }
    79         //printf("%d",sum);
    80         if(sum==n-1)
    81             printf("%.1lf
    ",ans*100);
    82         else
    83             printf("oh!
    ");
    84     }
    85     return 0;
    86 }
    View Code
  • 相关阅读:
    python gevent(协程模块)
    python基础之socket与socketserver
    python 使用 with open() as 读写文件
    Python logger模块
    python二维码操作:QRCode和MyQR入门
    常见的端口号及其用途
    python中hasattr()、getattr()、setattr()函数的使用
    mysql数据库自带数据库介绍
    关于BeautifulSoup4 解析器的说明
    学习opencv(1)
  • 原文地址:https://www.cnblogs.com/clliff/p/3903160.html
Copyright © 2011-2022 走看看