ICode9

精准搜索请尝试: 精确搜索
首页 > 其他分享> 文章详细

P4047 [JSOI2010]部落划分

2020-09-08 12:02:07  阅读:210  来源: 互联网

标签:JSOI2010 PII 部落 int double P4047 fi find se


一眼二分:
二分出最近的两个部落之间的最大距离,判断当前mid距离下能否划分成k个连通块

const int N=1010;
PII a[N];
int p[N];
double dist[N][N];
int n,k;

double dis(PII a,PII b)
{
    return sqrt((a.fi-b.fi)*(a.fi-b.fi)+(a.se-b.se)*(a.se-b.se));
}

int find(int x)
{
    if(x != p[x]) p[x]=find(p[x]);
    return p[x];
}

bool check(double mid)
{
    for(int i=0;i<n;i++) p[i]=i;

    for(int i=0;i<n;i++)
        for(int j=i+1;j<n;j++)
        {
            if(dist[i][j] > mid) continue;
            int pi=find(i),pj=find(j);
            p[pi]=pj;
        }

    int cnt=0;
    for(int i=0;i<n;i++)
        if(p[i] == i)
            cnt++;
    return cnt>=k;
}

int main()
{
    cin>>n>>k;

    for(int i=0;i<n;i++) cin>>a[i].fi>>a[i].se;

    double l=INF,r=0;
    for(int i=0;i<n;i++)
        for(int j=i+1;j<n;j++)
        {
            dist[i][j]=dis(a[i],a[j]);
            l=min(l,dist[i][j]);
            r=max(r,dist[i][j]);
        }

    for(int i=0;i<100;i++)
    {
        double mid=(l+r)/2;
        if(check(mid)) l=mid;
        else r=mid;
    }

    printf("%.2f\n",l);

    //system("pause");
}

标签:JSOI2010,PII,部落,int,double,P4047,fi,find,se
来源: https://www.cnblogs.com/fxh0707/p/13631705.html

本站声明: 1. iCode9 技术分享网(下文简称本站)提供的所有内容,仅供技术学习、探讨和分享;
2. 关于本站的所有留言、评论、转载及引用,纯属内容发起人的个人观点,与本站观点和立场无关;
3. 关于本站的所有言论和文字,纯属内容发起人的个人观点,与本站观点和立场无关;
4. 本站文章均是网友提供,不完全保证技术分享内容的完整性、准确性、时效性、风险性和版权归属;如您发现该文章侵犯了您的权益,可联系我们第一时间进行删除;
5. 本站为非盈利性的个人网站,所有内容不会用来进行牟利,也不会利用任何形式的广告来间接获益,纯粹是为了广大技术爱好者提供技术内容和技术思想的分享性交流网站。

专注分享技术,共同学习,共同进步。侵权联系[81616952@qq.com]

Copyright (C)ICode9.com, All Rights Reserved.

ICode9版权所有