luogu 4047 [JSOI2010]部落划分 最小生成树

最小生成树或者二分都行,但是最小生成树会好写一些~

Code:

#include <bits/stdc++.h>
#define ll long long
#define N 1000005
#define setIO(s) freopen(s".in","r",stdin)
using namespace std;
ll x[N],y[N];
int p[N];
struct Edge
{
    int u,v;
    ll c;
}e[N];
bool cmp(Edge a,Edge b)
{
    return a.c<b.c;
}
int find(int x)
{
    return p[x]==x?x:p[x]=find(p[x]);
}
int main()
{
    // setIO("input");
    int n,k,i,j,cnt=0,jj;
    scanf("%d%d",&n,&k);
    for(i=1;i<=n;++i) scanf("%lld%lld",&x[i],&y[i]);
    for(i=1;i<=n;++i) p[i]=i;
    for(i=1;i<=n;++i)
    {
        for(j=i+1;j<=n;++j)
        {
            ++cnt;
            e[cnt].u=i;
            e[cnt].v=j;
            e[cnt].c=(x[i]-x[j])*(x[i]-x[j])+(y[i]-y[j])*(y[i]-y[j]);
        }
    }
    sort(e+1,e+1+cnt,cmp);
    ll lst=0;
    int pp=n;
    lst=e[1].c;
    for(i=1;i<=cnt;i=j)
    {
        for(j=i;j<=cnt&&e[j].c==e[i].c;++j);
        for(jj=i;jj<j;++jj)
        {
            int u=e[jj].u;
            int v=e[jj].v;
            u=find(u), v=find(v);
            if(u!=v) p[u]=v, --pp;
            // printf("%d %d %lld\n",e[jj].u,e[jj].v,e[jj].c);
        }
        if(pp>=k)
        {
            lst=max(lst,e[j].c);
        }
        else
        {
            break;
        }
    }
    // printf("%lld\n",lst);
    printf("%.2f\n",sqrt(lst));
    return 0;
}

  

原文地址:https://www.cnblogs.com/guangheli/p/11602806.html

时间: 2024-11-12 17:30:55

luogu 4047 [JSOI2010]部落划分 最小生成树的相关文章

P4047 [JSOI2010]部落划分

P4047 [JSOI2010]部落划分 题目描述 聪聪研究发现,荒岛野人总是过着群居的生活,但是,并不是整个荒岛上的所有野人都属于同一个部落,野人们总是拉帮结派形成属于自己的部落,不同的部落之间则经常发生争斗.只是,这一切都成为谜团了--聪聪根本就不知道部落究竟是如何分布的. 不过好消息是,聪聪得到了一份荒岛的地图.地图上标注了N个野人居住的地点(可以看作是平面上的坐标).我们知道,同一个部落的野人总是生活在附近.我们把两个部落的距离,定义为部落中距离最近的那两个居住点的距离.聪聪还获得了一个

1821. [JSOI2010]部落划分【并查集+二分】

Description 聪聪研究发现,荒岛野人总是过着群居的生活,但是,并不是整个荒岛上的所有野人都属于同一个部落,野人们总是拉帮结派形成属于自己的部落,不同的部落之间则经常发生争斗.只是,这一切都成为谜团了——聪聪根本就不知道部落究竟是如何分布的. 不过好消息是,聪聪得到了一份荒岛的地图.地图上标注了N个野人居住的地点(可以看作是平面上的坐标).我们知道,同一个部落的野人总是生活在附近.我们把两个部落的距离,定义为部落中距离最近的那两个居住点的距离.聪聪还获得了一个有意义的信息——这些野人总共

BZOJ 1821 JSOI2010 部落划分 Group Kruskal

题目大意:给定平面上的n个点,要求将这n个点划分为k个集合,使划分后任意两个集合中最近两点的距离的最大值最小,输出这个最小值 考虑这n个点之间所有的连边 我们要让长边保留 就尽量选取短边链接 于是就是求加入n-k条边的最小生成森林 由于输出下一个最小值 因此Kruskal加入第n-k+1条边时输出边权即可 #include <cmath> #include <cstdio> #include <cstring> #include <iomanip> #inc

[bzoj1821][JSOI2010]部落划分(贪心)

题目:http://www.lydsy.com:808/JudgeOnline/problem.php?id=1821 分析:题目看起来很吊,但只要贪心就行了,每次取相邻最近的两个点所在的集合合并知道只剩k个集合就行了.具体操作就是按边排序然后并查集就行了

【BZOJ】1821: [JSOI2010]Group 部落划分 Group(最小生成树+贪心)

http://www.lydsy.com:808/JudgeOnline/problem.php?id=1821 这题裸题. 本题要求最短距离最长,很明显,我们排序. 这里存在贪心,即我们把边权最小的全分给n个部落的内部,然后剩下的边最小的就是答案. 将边权较小的边分给k个部落,用并查集生成最小树,使得内部的边总是小于连到外部的边.然后分剩下k个点即可,剩下的k个点的那条边一定是部落之间最小的且最长的边. #include <cstdio> #include <cstring> #

【最小生成树+贪心】BZOJ1821: [JSOI2010]Group 部落划分 Group

Description 聪聪研究发现,荒岛野人总是过着群居的生活,但是,并不是整个荒岛上的所有野人都属于同一个部落,野人们总是拉帮结派形成属于自己的部落,不同的部落之间则经常发生争斗.只是,这一切都成为谜团了——聪聪根本就不知道部落究竟是如何分布的. 不过好消息是,聪聪得到了一份荒岛的地图.地图上标注了N个野人居住的地点(可以看作是平面上的坐标).我们知道,同一个部落的野人总是生活在附近.我们把两个部落的距离,定义为部落中距离最近的那两个居住点的距离.聪聪还获得了一个有意义的信息——这些野人总共

1821: [JSOI2010]Group 部落划分 Group

1821: [JSOI2010]Group 部落划分 Group Time Limit: 10 Sec  Memory Limit: 64 MBSubmit: 1308  Solved: 627[Submit][Status] Description 聪聪研究发现,荒岛野人总是过着群居的生活,但是,并不是整个荒岛上的所有野人都属于同一个部落,野人们总是拉帮结派形成属于自己的部落,不同的部落之间则经常发生争斗.只是,这一切都成为谜团了——聪聪根本就不知道部落究竟是如何分布的. 不过好消息是,聪聪得

【BZOJ 1821】 [JSOI2010]Group 部落划分 Group

1821: [JSOI2010]Group 部落划分 Group Time Limit: 10 Sec  Memory Limit: 64 MB Submit: 1353  Solved: 650 [Submit][Status][Discuss] Description 聪聪研究发现,荒岛野人总是过着群居的生活,但是,并不是整个荒岛上的所有野人都属于同一个部落,野人们总是拉帮结派形成属于自己的部落,不同的部落之间则经常发生争斗.只是,这一切都成为谜团了--聪聪根本就不知道部落究竟是如何分布的.

洛谷 1821: [JSOI2010]Group 部落划分 Group

1821: [JSOI2010]Group 部落划分 Group Time Limit: 10 Sec  Memory Limit: 64 MBSubmit: 2596  Solved: 1221[Submit][Status][Discuss] Description 聪聪研究发现,荒岛野人总是过着群居的生活,但是,并不是整个荒岛上的所有野人都属于同一个部落,野人们总是拉帮结派形成属于自己的部落,不同的部落之间则经常发生争斗.只是,这一切都成为谜团了——聪聪根本就不知道部落究竟是如何分布的.