• hdu 1875 畅通工程再续


    #include <stdio.h>
    #include <string.h>
    #include <iostream>
    #include <algorithm>
    #include <vector>
    #include <queue>
    #include <set>
    #include <map>
    #include <string>
    #include <math.h>
    #include <stdlib.h>
    #include <time.h>
    using namespace std;
    
    struct data
    {
        int u,v;
        double w;
    }e[5000];
    
    bool cmp(data a, data b)
    {
        return a.w<b.w;
    }
    
    double x[100+5],y[100+5];
    int n,m,bin[5000];
    
    int Find(int x)
    {
        int s;
        for(s=x;bin[s]>=0;s=bin[s]);
    
        while(s!=x)
        {
            int t=bin[x];
            bin[x]=s;
            x=t;
        }
        return s;
    }
    
    void Union(int x1,int x2)
    {
        int f1=Find(x1),f2=Find(x2);
        int t=bin[f1]+bin[f2];
        if(bin[f1]>bin[f2])
        {
            bin[f1]=f2;
            bin[f2]=t;
        }
        else
        {
            bin[f2]=f1;
            bin[f1]=t;
        }
    
    }
    
    int main()
    {
        //freopen("in.txt","r",stdin);
        //freopen("out.txit","w",stdout);
        int _,i,j,cas=0,num,u,v;
        double t,sum;
        scanf("%d",&_);
        while(_--)
        {
            scanf("%d",&n);
            if(n==0) break;
            for(i=0;i<=n;i++)
                bin[i]=-1;
            for(i=0;i<n;i++)
                scanf("%lf%lf",&x[i],&y[i]);
    
            m=0;
            for(i=0;i<n;i++)
                for(j=i+1;j<n;j++)
                {
                    t=sqrt((x[i]-x[j])*(x[i]-x[j])+(y[i]-y[j])*(y[i]-y[j]));
                    if(t<10||t>1000) continue;
                    e[m].u=i;
                    e[m].v=j;
                    e[m].w=t;
                    m++;
                }
    
            sort(e,e+m,cmp);
            sum=0;
            num=0;
            for(i=0;i<m;i++)
            {
                u=e[i].u;
                v=e[i].v;
                if(Find(u)!=Find(v))
                {
                    sum+=e[i].w;
                    Union(u,v);
                    num++;
                }
                if(num>=n-1) break;
            }
            if(num<n-1) printf("oh!
    ");
            else printf("%.1f
    ",sum*100);
        }
        return 0;
    }

    版权声明:本文为博主原创文章,未经博主允许不得转载。http://xiang578.top/

  • 相关阅读:
    linux配置虚拟机的网络服务
    js动态生成层方法 不懂得加QQ 2270312758
    js中let和var的区别 不懂得加QQ 2270312758
    C#特性详解
    (四)python之文件处理
    (三)python之字符编码
    (二)Python之数据类型
    (一)python基础
    (2)库相关操作
    (1)初始数据库
  • 原文地址:https://www.cnblogs.com/xryz/p/4847913.html
Copyright © 2020-2023  润新知