zoukankan      html  css  js  c++  java
  • HDU

    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!

    一代模板如下

    AC代码:(仅供参考)

     1 #include<cstdio>
      2 #include<cmath>
      3 #include<cstring>
      4 #include<algorithm>
      5 
      6 using namespace std;
      7 
      8 #define N 110000
      9 
     10 int father[N];
     11 
     12 int sum;
     13 
     14 struct no
     15 {
     16     int x,y;
     17 }di[N];
     18 
     19 struct node
     20 {
     21     int s,e;
     22     double l;
     23 }dd[N];
     24 
     25 int Find(int n)
     26 {
     27     while(n!=father[n])
     28         n=father[n];
     29 
     30     return n;
     31 }
     32 
     33 void Fin(int x,int y)
     34 {
     35     int a,b;
     36 
     37     a=Find(x);
     38     b=Find(y);
     39 
     40     if(a!=b)
     41     {
     42       father[b]=a;
     43       sum++;
     44     }
     45 }
     46 
     47 bool cmp(node a, node b)
     48 {
     49     return a.l < b.l;
     50 }
     51 
     52 int main()
     53 {
     54     int t;
     55 
     56     scanf("%d",&t);
     57 
     58     while(t--)
     59     {
     60         int c;
     61 
     62         scanf("%d",&c);
     63 
     64         for(int i=0; i<=c; i++)
     65             father[i]=i;
     66 
     67         for(int i=0; i<c; i++)
     68         scanf("%d%d",&di[i].x, &di[i].y);
     69 
     70         if(c==1)
     71         {
     72             printf("0.0
    ");
     73             continue;
     74         }
     75 
     76         int k=0;
     77 
     78         for(int i=0; i<c; i++)
     79             for(int j=i+1; j<c; j++)
     80             {
     81                 double mi=sqrt((double)(di[i].x-di[j].x)*(di[i].x-di[j].x)+(double)(di[i].y-di[j].y)*(di[i].y-di[j].y));
     82 
     83                 if(mi >= 10 && mi <= 1000)
     84                 {
     85                     dd[k].s=i;
     86                     dd[k].e=j;
     87                     dd[k].l=mi;
     88                     k++;
     89                 }
     90             }
     91 
     92         sort(dd,dd+k,cmp);
     93 
     94         sum=1;
     95         double sun=0;
     96 
     97         for(int i=0; i<k; i++)
     98             if(Find(dd[i].s) != Find(dd[i].e))
     99             {
    100                 Fin(dd[i].s,dd[i].e);
    101                 sun+=dd[i].l;
    102             }
    103 
    104         if(sum < c)
    105             printf("oh!
    ");
    106         else
    107             printf("%.1lf
    ",sun*100);
    108 
    109     }
    110     return 0;
    111 }
    View Code

    不甘心,自己再来一

     1 #include<cstdio>
     2 #include<cmath>
     3 #include<cstring>
     4 #include<algorithm>
     5 
     6 using namespace std;
     7 
     8 #define N 110000
     9 
    10 int p[N], s;
    11 
    12 struct data
    13 {
    14     int x, y;
    15 }v[N];
    16 
    17 struct node
    18 {
    19     int a, b;
    20     double l;
    21 }d[N];
    22 
    23 bool cmp(node a, node b)
    24 {
    25     return a.l < b.l;
    26 }
    27 
    28 int Find(int x)
    29 {
    30     while(p[x] != x)
    31         x = p[x];
    32 
    33     return x;
    34 }
    35 
    36 void Fin(int x, int y)
    37 {
    38     int a = Find(x);
    39     int b = Find(y);
    40 
    41     if (a != b)
    42     {
    43         s++;
    44         p[b] = a;
    45     }
    46 }
    47 
    48 int main()
    49 {
    50     int T;
    51     scanf ("%d", &T);
    52 
    53     while (T--)
    54     {
    55         int n;
    56 
    57         scanf ("%d", &n);
    58 
    59         for (int i = 0; i <= n; i++)
    60             p[i] = i;
    61 
    62         for (int i = 0; i < n; i++)
    63             scanf ("%d %d", &v[i].x, &v[i].y);
    64 
    65         int k = 0;
    66 
    67         for (int i = 0; i < n; i++)
    68             for (int j = i+1; j < n; j++)
    69         {
    70             double mi =sqrt((double)(v[i].x - v[j].x)*(v[i].x - v[j].x) + (double)(v[i].y - v[j].y)*(v[i].y - v[j].y));
    71 
    72             if (mi >= 10 && mi <= 1000)
    73             {
    74                 d[k].a = i;
    75                 d[k].b = j;
    76                 d[k].l = mi;
    77                 k++;
    78             }
    79         }
    80 
    81         double num = 0;
    82         s = 0;
    83         sort(d, d+k, cmp);
    84 
    85         for (int i = 0; i < k; i++)
    86             if (Find(d[i].a) != Find(d[i].b))
    87             {
    88                 num += d[i].l;
    89                 Fin(d[i].a, d[i].b);
    90             }
    91 
    92         if (s < n-1)
    93             printf ("oh!
    ");
    94         else
    95             printf ("%.1f
    ", 100*num);
    96     }
    97     return 0;
    98 }
    View Code
  • 相关阅读:
    linux-tar备份
    实验
    华为HCIA-命令及配置
    1、基本知识
    linux 安装samba
    POJ 2676 Sudoku (搜索,Dancing Links)
    HDU 1535 Invitation Cards (最短路,附SLF优化SPFA)
    ZOJ 3625 Geek's Collection (数学公式,注意long double输出格式,附输出格式总结)
    SGU 185 Two shortest (最大流)
    SPOJ PROFIT Maximum Profit (最大闭合权子图,最小割)
  • 原文地址:https://www.cnblogs.com/Aa948766160/p/5749952.html
Copyright © 2011-2022 走看看