BZOJ1821_[JSOI]Group部落划分_KEY

Posted Cptraser

tags:

篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了BZOJ1821_[JSOI]Group部落划分_KEY相关的知识,希望对你有一定的参考价值。

题目传送门

这是一道并查集的题目,相信很多人都看出来了。

用一个类似Kurskal的东西求出最近的最大值。

对于一些可以划分在同一个部落里的边,我们一定是优先选择短边合并。

code

/**************************************************************
    Problem: 1821
    User: yekehe
    Language: C++
    Result: Accepted
    Time:432 ms
    Memory:9136 kb
****************************************************************/
 
#include <bits/stdc++.h>
using namespace std;
int a[1001],b[1001];
int n,k,now,fa[1001];
double p(double x1,double x2,double y1,double y2){
    return (x1-x2)*(x1-x2)+(y1-y2)*(y1-y2);
}
double w[1001];
struct node{
    int x,y;
    double c;
}l[500001];
inline int cmp(node x,node y){return x.c<y.c;}
int getf(int x){return x==fa[x]?x:fa[x]=getf(fa[x]);}
int main(){
    scanf("%d%d",&n,&k);
        for(int i=1;i<=n;i++)
            scanf("%d%d",&a[i],&b[i]);
        for(int i=1;i<=n;i++)
            for(int j=i+1;j<=n;j++)
                l[++now].x=i,l[now].y=j,l[now].c=p(a[i],a[j],b[i],b[j]);
    sort(l+1,l+now+1,cmp);
        for(int i=1;i<=n;i++)fa[i]=i;
    int ans=0,i;
        for(i=1;i<=now;i++){
            int x=getf(l[i].x),y=getf(l[i].y),c=l[i].c;
            if(x!=y){
                fa[x]=y;
                w[++ans]=c;
                if(ans==n-1)break;
            }
        }
    printf("%.2lf",sqrt(w[n-k+1]));
    return 0;
}

 

以上是关于BZOJ1821_[JSOI]Group部落划分_KEY的主要内容,如果未能解决你的问题,请参考以下文章

BZOJ 1821 JSOI2010 Group 部落划分 Group

bzoj 1821: [JSOI2010]Group 部落划分 Group

BZOJ-1821: [JSOI2010]Group 部落划分 Group (二分+并查集)

[Bzoj1821][JSOI2010]Group 部落划分 Group(并查集)(二分答案)

bzoj1821[JSOI2010]Group 部落划分 Group

BZOJ_1821_[JSOI2010]_部落划分_(贪心,并查集)