• HDOJ 1875


    畅通工程再续

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

    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!
     
    prim算法实现:当answer大于inf时说明无法完全联通,输出oh!
     1 #include<stdio.h>
     2 #include<string.h>
     3 #include <math.h>
     4 #define inf 0xffffff
     5 double g[101][101];
     6 int sum;
     7 double ans;
     8 void prim(int n)
     9 {
    10     double lowcost[101],min;
    11     int used[101],closet[101];
    12     int i,j,k;
    13     memset(used,0,sizeof(used));
    14     for(i=1;i<=n;i++)
    15         lowcost[i]=g[i][1],
    16         closet[i]=1;
    17     used[1]=1;
    18     for(i=1;i<n;i++)
    19     {
    20         min=inf;
    21         j=1;
    22         for(k=2;k<=n;k++)
    23             if(lowcost[k]<min&&!used[k])
    24                 min=lowcost[k],j=k;
    25         used[j]=1;
    26         ans+=g[j][closet[j]];
    27         sum++;
    28         for(k=2;k<=n;k++)
    29         {
    30             if(g[k][j]<lowcost[k]&&!used[k])
    31                 lowcost[k]=g[k][j],
    32                 closet[k]=j;
    33         }
    34     }
    35 
    36 }
    37 int main()
    38 {
    39     int a,b,t,i,j,c,k,n;
    40     scanf("%d",&t);
    41     for(k=1;k<=t;k++)
    42     {
    43         ans=0;sum=1;
    44         scanf("%d",&n);
    45         for(i=1;i<=n;i++)
    46             for(j=1;j<=n;j++)
    47                 g[i][j]=inf;
    48         int p[101][2];
    49         for(i=1;i<=n;i++)
    50             scanf("%d %d",&p[i][0],&p[i][1]);
    51         for(i=1;i<=n;i++)
    52         {
    53             for(j=1;j<=n;j++)
    54             {
    55                 double len=sqrt(double((p[i][0]-p[j][0])*(p[i][0]-p[j][0])+(p[i][1]-p[j][1])*(p[i][1]-p[j][1])));
    56                 if(len>=10&&len<=1000)
    57                     g[i][j]=g[j][i]=len;
    58             }
    59         }
    60         prim(n);
    61         if(ans>inf)
    62             printf("oh!
    ");
    63         else
    64         printf("%.1lf
    ",ans*100);
    65     }
    66     return 0;
    67 }
    View Code
     
    9848222 2013-12-17 19:46:20 Accepted 1875 31MS 356K 1187 B C++ 泽泽
  • 相关阅读:
    51Nod--1247 可能的路径(gcd)
    51Nod--1117 聪明的木匠(排序)
    51Nod--1076 2条不相交的路径(强连通分量)
    HDU--4486 Task(贪心)
    BZOJ--1045-- 糖果传递(中位数,排序)
    [Windows Server 2012] Discuz X3安全设置
    [Windows Server 2012] PHPWind安全设置
    [Windows Server 2012] MySQL安全加固
    [Windows Server 2012] Filezilla安全加固方法
    [Windows Server 2012] WordPress安全设置方法
  • 原文地址:https://www.cnblogs.com/zeze/p/hdoj1875.html
Copyright © 2020-2023  润新知