HDU 畅通工程再续

#include<iostream>
#include<cstdio>
#include<vector>
#include<algorithm>
#include<cmath>
#include<cstring>
using namespace std;
struct node{
    int x;
    int y;
};
struct road{
    int x;
    int y;
    double len;
};
int f[105];
bool cmp(road a,road b){
    return a.len<b.len;
}
double dis(int x,int y,int x1,int y1){
    return sqrt((x1-x)*(x1-x)+(y1-y)*(y1-y));
}
int find(int x){
    if(f[x]==x) return x;
    return find(f[x]);
}
int merge(int x,int y){
    int fx=find(x);
    int fy=find(y);
    if(fx!=fy){
        f[fy]=fx;
        return 1;
    }
    return 0;
}
int main()
{
    int t,c;
    cin>>t;
    while(t--){
        cin>>c;
        node a[105];
        double dp[105][105];
        double sum=0;
        int ans=0;
        road r;
        int i,j;
        vector<road> v;
        memset(dp,0,sizeof(dp));
        for(i=0;i<=100;i++) f[i]=i;
        for(i=0;i<c;i++){
            cin>>a[i].x>>a[i].y;
        }
        for(i=0;i<c;i++){
            for(j=0;j<c;j++){
                if(i==j) dp[i][j]=0;
                else dp[i][j]=dis(a[i].x,a[i].y,a[j].x,a[j].y);
                if(10<=dp[i][j]&&dp[i][j]<=1000){
                    r.len=dp[i][j];
                    r.x=i;
                    r.y=j;
                    v.push_back(r);
                }
            }
        }
        sort(v.begin(),v.end(),cmp);
        int flag=0;
        for(i=0;i<v.size();i++){
            if(merge(v[i].x,v[i].y)){
                ans++;
                sum+=v[i].len*100;
            }
            if(ans==c-1){
                flag=1;
                break;
            }
        }
        if(flag==1) printf("%.1f\n",sum);
        else printf("oh!");
    }
    return 0;
}

猜你喜欢

转载自blog.csdn.net/qq_37016724/article/details/88822531