今天A了好多畅通工程————hdu-1874再续畅通工程

来源:互联网 发布:数据库中的主键怎么设 编辑:程序博客网 时间:2024/05/24 04:52
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!

代码:

#include<iostream>#include<cstdio>#include<cstring>#include<cmath>#include<algorithm>using namespace std;const int maxn=5200;int u[maxn],v[maxn],st[maxn][2];int root[maxn];int r[maxn];double w[maxn];int cmp(int x,int y){return w[x]<=w[y];}void makeset(int n,int m){    int i;    for(i=1;i<=n;i++)        root[i]=i;    for(i=1;i<=m;i++)        r[i]=i;}int look(int x){    while(x!=root[x])        x=root[x];    return x;}double kruskal(int n,int m){    double ans=0;    int i;    makeset(n,m);    sort(r+1,r+m+1,cmp);    for(i=1;i<=m;i++)    {   int row=r[i];        int x=look(v[row]);        int y=look(u[row]);        if(x!=y&&w[row]>=10&&w[row]<=1000)        {ans+=w[row];         root[x]=y;        }    }    return ans;}int main(){    int m,n,i,k,p;    double d;    while(~scanf("%d",&k))    {        while(k--)        {  int flag=0;            p=1;            scanf("%d",&n);              for(i=1;i<=n;i++)                 {scanf("%d%d",&st[i][0],&st[i][1]);}              m=n*(n-1)/2;            for(int i=1;i<n;i++)              for(int j=i+1;j<=n;j++)                   {  u[p]=i;v[p]=j;                       w[p]=sqrt(1.0*(st[i][0]-st[j][0])*(st[i][0]-st[j][0])+1.0*(st[i][1]-st[j][1])*(st[i][1]-st[j][1]));                      p++;                     }            d=kruskal(n,m)*100;            for(i=1;i<=n;i++)                if(root[i]==i)                 flag++;             if(flag==1)                {                    printf("%.1lf\n",d);}             else                printf("oh!\n");        }    }}


原创粉丝点击