畅通工程再续(Kruskal)

 

const int N=1e4+5;
 
    int n,m,t;
    int i,j,k;
    int fa[N];
struct node
{
    int u,v;
    double w;
    bool operator<(node b){
        if(w!=b.w) return w<b.w;
        if(u!=b.u) return u<b.u;
        return v<b.v;
    }
}G[N];

int Find(int x)
{
    if(fa[x]==x) return x;
    return fa[x]=Find(fa[x]);
}
void Kruskal(int n,int m)
{
    double ans=0;
    sort(G+1,G+1+m);
    for(i=1;i<=n;i++) fa[i]=i;
    int cnt=0;
    for(i=1;i<=m;i++){
        int x=Find(G[i].u);
        int y=Find(G[i].v);
        if(x==y) continue;
        cnt++;
        fa[x]=y;
        ans+=G[i].w;
        if(cnt==n-1) break;
    }
    if(cnt==n-1) pf(ans*100);
    else puts("oh!");
}

double calc(int x,int y,int nx,int ny)
{
    double xx=x-nx;
    double yy=ny-y;
    return sqrt(xx*xx+yy*yy);
}
int x[N],y[N];
int main()
{
    //IOS;
    rush(){
        sd(n);
        for(i=1;i<=n;i++){
            sdd(x[i],y[i]);
        }
        int num=0;
        for(i=1;i<=n;i++){
            for(j=i+1;j<=n;j++){
                double tmp=calc(x[i],y[i],x[j],y[j]);
                if(tmp>=10.0 && tmp<=1000.0){
                    G[++num].w=tmp;
                    G[num].u=i;
                    G[num].v=j;
                }
            }
        }
        Kruskal(n,num);
    }
    //PAUSE;
    return 0;
}

猜你喜欢

转载自blog.csdn.net/C_Dreamy/article/details/107824290