码迷,mamicode.com
首页 > 其他好文 > 详细

畅通工程再续 HDU - 1875

时间:2020-01-29 17:52:38      阅读:92      评论:0      收藏:0      [点我收藏+]

标签:cond   bool   find   pre   工程   sizeof   efi   col   ring   

#include<iostream>
#include<algorithm>
#include<cstring>
#include<cmath>
using namespace std;
#define x first
#define y second
const int N=210;
typedef pair<double,double>PII;
PII a[N];
int p[N];
struct edge{
    int a,b;
    double w;
}e[N*N];
bool cmp(edge a,edge b)
{
    return a.w<b.w;
}
double get_dist(int i,int j)
{
    int dx=a[i].x-a[j].x;
    int dy=a[i].y-a[j].y;
    return sqrt(dx*dx+dy*dy);
}
int find(int x)
{
    if(p[x]!=x)
        p[x]=find(p[x]);
    return p[x];
}
int main()
{
    int t;
    cin>>t;
    while(t--)
    {
        memset(p,0,sizeof p);
        memset(e,0,sizeof e);
        memset(a,0,sizeof a);
        int n;
        cin>>n;
        for(int i=1;i<=n;i++)
            cin>>a[i].x>>a[i].y;
        for(int i=1;i<=n;i++)
            p[i]=i;
        int k=0;
        for(int i=1;i<=n;i++)
            for(int j=i+1;j<=n;j++)
                {
                    double w=get_dist(i,j);
                    if(w>=10&&w<=1000)
                        e[k++]={i,j,w};
                }
        sort(e,e+k,cmp);
        double sum=0;
        for(int i=0;i<k;i++)
        {
            int a=find(e[i].a);
            int b=find(e[i].b);
            double w=e[i].w;
            if(a!=b)
            {
                p[a]=b;
                sum+=w;
            }
        }
        int ans=0;
        for(int i=1;i<=n;i++)
            if(p[i]==p[1])
                ans++;
        if(ans==n)
            printf("%.1f\n",sum*100);
        else
            cout<<"oh!"<<endl;
    }
    return 0;
}

 

畅通工程再续 HDU - 1875

标签:cond   bool   find   pre   工程   sizeof   efi   col   ring   

原文地址:https://www.cnblogs.com/QingyuYYYYY/p/12240763.html

(0)
(0)
   
举报
评论 一句话评论(0
登录后才能评论!
© 2014 mamicode.com 版权所有  联系我们:gaon5@hotmail.com
迷上了代码!