zoukankan      html  css  js  c++  java
  • hdoj1875 最小生成树之畅通工程再续

    畅通工程再续

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


    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
     
    这题也是直接用prim算法 处理得时候还是出了点问题 初始化要明确
    View Code
     1 #include <iostream>
     2 #include <cmath>
     3 using namespace std;
     4 #define  max 101
     5 const int intmax=1<<29;
     6 double p[max][max],dist[max],a[max],b[max];
     7 bool flag[max];
     8 int n,v;
     9 
    10 void init()
    11 {
    12     double k;
    13     for (int i=0;i<n;i++)
    14     {
    15         for (int j=0;j<n;j++)
    16         {
    17             if (i==j)        p[i][j]=intmax;        
    18             else   
    19             {
    20                 k=sqrt(fabs(1.0*(a[j]-a[i])*(a[j]-a[i])+1.0*(b[j]-b[i])*(b[j]-b[i])));
    21                 if (k<=1000&&k>=10)
    22                 {
    23                     p[i][j]=k;
    24                 }
    25                 else p[i][j]=intmax;
    26             }
    27         //    printf("%.1lf   ",p[i][j]);
    28         }
    29     //    cout<<endl;
    30     }
    31 }
    32 
    33 double prim()
    34 {
    35     int i,j;
    36     double min,sum=0;;
    37     for ( i=0;i<n;i++)
    38     {
    39         dist[i]=p[v][i];
    40         flag[i]=0;
    41     }
    42     flag[v]=1;
    43     for (i=0;i<n-1;i++)
    44     {
    45         min=intmax;
    46         for (j=0;j<n;j++)
    47             if (!flag[j]&&min>dist[j])
    48                 min=dist[v=j];
    49             if (intmax-min<1e-9)
    50                 return -1;
    51             sum+=min;
    52             flag[v]=1;
    53             for (j=0;j<n;j++)
    54                 if (!flag[j]&&dist[j]>p[v][j])
    55                     dist[j]=p[v][j];
    56     }
    57     return sum;
    58 }
    59 
    60 int main()
    61 {
    62     int T,i;
    63     double k;
    64     cin>>T;
    65     while (T--)
    66     {
    67         cin>>n;
    68         for (i=0;i<n;i++)
    69         {
    70             scanf("%lf%lf",&a[i],&b[i]);
    71         }
    72         init();
    73         v=0;
    74         k=prim();
    75         if (k<0)
    76             cout<<"oh!"<<endl;
    77         else printf("%.1lf\n",k*100);
    78     }
    79     return 0;
    80 }
  • 相关阅读:
    define和typedef
    keil5配置stm32库函数开发
    SPI、CAN、I2C
    flash,sram
    关于网络地址
    关于定时器、波特率、TH和TL值的计算
    关于串口工作方式
    ad各层
    AD快捷键
    OAuth2.0 微博登陆网站功能的实现(一)获取用户授权及令牌 Access Token
  • 原文地址:https://www.cnblogs.com/wujianwei/p/2593201.html
Copyright © 2011-2022 走看看