zoukankan      html  css  js  c++  java
  • HDU 1875 畅通工程再续

    畅通工程再续

    相信大家都听说一个“百岛湖”的地方吧,百岛湖的居民生活在不同的小岛中,当他们想去其他的小岛时都要通过划小船来实现。现在政府决定大力发展百岛湖,发展首先要解决的问题当然是交通问题,政府决定实现百岛湖的全畅通!经过考察小组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<cstdio>
    #include<cmath>
    #include<algorithm>
    using namespace std;
    
    const int maxn=110*110;
    
    struct node {
        int x,y;
    }a[110];
    
    struct node1{
        int x,y;
        double dis;
    }b[maxn];
    
    int vis[maxn];
    int find(int a)
    {
        if(vis[a]==a)
        return a;
        return vis[a]=find(vis[a]);
    }
    
    void mix(int a,int b)
    {
        int x=find(a);
        int y=find(b);
        if(x!=y)
        vis[x]=y;
    }
    
    bool cmp(node1 a,node1 b)
    {
        return a.dis<b.dis ;
    }
    
    int main()
    {
        int t;
        scanf("%d",&t)  ;
        while(t--)
        {
            int n;
            scanf("%d",&n);
            for(int i=1;i<=n;i++)
                scanf("%d%d",&a[i].x ,&a[i].y );
            for(int i=1;i<=n;i++)   
                vis[i]=i;
            int c=0;
             for(int i=1;i<n;i++)
             {
                for(int j=i+1;j<=n;j++)
                {
                    b[c].x =i;
                    b[c].y =j;
                    b[c++].dis =sqrt((a[i].x -a[j].x )*(a[i].x -a[j].x )+(a[i].y -a[j].y )*(a[i].y -a[j].y ));
                 }
             }  
            sort(b,b+c,cmp);
            double sum=0;
            for(int i=0;i<c;i++)
            {
                if(find(b[i].x)!=find(b[i].y )&&b[i].dis >=10&&b[i].dis <=1000)
                {
                    sum+=b[i].dis ;
                    mix(b[i].x ,b[i].y );
                }
            }   
            sum*=100;
            int ans=0;
            for(int i=1;i<=n;i++)
            if(vis[i]==i)
            ans++;
            if(ans==1)
            printf("%.1lf
    ",sum);
            else
            printf("oh!
    ");
        }
    
        return 0;
    }
  • 相关阅读:
    mysql的if 和 case when
    hive的日期和时间
    DVWA——XSS(Stored)(存储型跨站脚本)
    DVWA——XSS(Reflected)(反射型跨站脚本)
    DVWA——SQL Injection(Blind)(SQL盲注)
    转载一篇注入类型判断
    DVWA——SQL Injection(SQL注入)
    DVWA——Insecure CAPTCHA (不安全的验证码)
    DVWA——File Upload(文件上传)
    DVWA——File Inclusion(文件包含)
  • 原文地址:https://www.cnblogs.com/-xiangyang/p/9220255.html
Copyright © 2011-2022 走看看