一道最小生成树经典题

由于是最靠近的两个部落尽可能远,如果我们先处理出任意两个居住点之间的距离并将其当做边,那么我们可以发现,因为在一个部落里面的边是不用计入答案的,所以应该要尽量把小边放在一个部落里,

由此,我们可以想到最小生成树,也是每次都优先选小的边,只不过这里要求的是尽可能远,所以就相当于是把选出的最小边都去掉。

那k个集合的问题怎么办呢?

我们在做最小生成树的时候,其实也是集合不断合并的过程,放在这道题中,就相当于是一个个居住点不断被划分到部落里的过程,因此当集合只剩k个时,也就是分配好了k个部落,因为每次合并都会少一个集合,所以我们用一个变量记录下来当前还有多少集合(或还要删几个,已经删了几个之类的都可以)。

剩k个的时候就退出。

然后由于边已经排好序,所以我们从退出的那条边(没有被选上)开始,依次向后遍历,第一个不在一个集合里的边就是答案(因为在一个集合里就意味这被划分到了一个部落,不能算作答案)

简而言之就是:将求最小值最大转换为用kruskal去掉小边,最后就会留下最优的边

 #include<bits/stdc++.h>
using namespace std;
#define AC 1000010
#define R register int
struct abc{
int f,w,length;
}way[AC];
int n,k,x[],y[],now;
int father[],tot,cnt;//tot为已经消除的并查集个数, bool cmp(abc a,abc b)
{
return a.length<b.length;
} inline int find(int x)
{
if(father[x]==x) return x;
else return father[x]=find(father[x]);
} inline int read()
{
int x=;char c;
while(isspace(c=getchar()));
while(c>='' && c<='')x=x*+c-'',c=getchar();
return x;
} void kruskal()
{
int father1,father2;
for(R i=;i<=cnt;i++)
{
father1=find(way[i].f),father2=find(way[i].w);
if(father1!=father2)
{
tot++;
if(father1<father2) father[father2]=father1;
else father[father1]=father2;
if(n-tot==k)//合并到k个集合就退出
{
now=i+;//搜索答案从now开始,因为之前没有选的边都是因为在同一个集合内
break;//而这里要统计的是不同部落的距离
}
}
}
} void pre()
{
n=read(),k=read();
for(R i=;i<=n;i++) x[i]=read(),y[i]=read(),father[i]=i;
for(R i=;i<=n;i++)
for(R j=i+;j<=n;j++)
{
way[++cnt].f=i,way[cnt].w=j;
way[cnt].length=(x[i]-x[j])*(x[i]-x[j])+(y[i]-y[j])*(y[i]-y[j]);
}//非真实距离
sort(way+,way+cnt+,cmp);
} void work()
{
kruskal();
for(R i=now;i<=cnt;i++)
{
if(find(way[i].f) != find(way[i].w))
{
printf("%.2f\n",sqrt((double)way[i].length));
exit();
}
}
} int main()
{
// freopen("in.in","r",stdin);
pre();
work();
// fclose(stdin);
return ;
}

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

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

    最小生成树或者二分都行,但是最小生成树会好写一些~ Code: #include <bits/stdc++.h> #define ll long long #define N 100000 ...

  2. P4047 [JSOI2010]部落划分 方法记录

    原题链接 [JSOI2010]部落划分 题目描述 聪聪研究发现,荒岛野人总是过着群居的生活,但是,并不是整个荒岛上的所有野人都属于同一个部落,野人们总是拉帮结派形成属于自己的部落,不同的部落之间则经常 ...

  3. 【BZOJ1821】[JSOI2010]部落划分(二分,并查集)

    [BZOJ1821][JSOI2010]部落划分(二分,并查集) 题面 BZOJ 洛谷 题解 二分答案,把距离小于二分值的点全部并起来,\(\mbox{check}\)一下是否有超过\(K\)个集合就 ...

  4. 洛谷P4047 [JSOI2010]部落划分题解

    洛谷P4047 [JSOI2010]部落划分题解 题目描述 聪聪研究发现,荒岛野人总是过着群居的生活,但是,并不是整个荒岛上的所有野人都属于同一个部落,野人们总是拉帮结派形成属于自己的部落,不同的部落 ...

  5. P4047 [JSOI2010]部落划分(最小生成树)

    题目描述 聪聪研究发现,荒岛野人总是过着群居的生活,但是,并不是整个荒岛上的所有野人都属于同一个部落,野人们总是拉帮结派形成属于自己的部落,不同的部落之间则经常发生争斗.只是,这一切都成为谜团了——聪 ...

  6. BZOJ 1821 JSOI2010 部落划分 Group prim

    Description 聪聪研究发现,荒岛野人总是过着群居的生活,但是,并不是整个荒岛上的所有野人都属于同一个部落,野人们总是拉帮结派形成属于自己的部落,不同的部落之间则经常发生争斗.只是,这一切都成 ...

  7. 「LuoguP4047」 [JSOI2010]部落划分

    Description 聪聪研究发现,荒岛野人总是过着群居的生活,但是,并不是整个荒岛上的所有野人都属于同一个部落,野人们总是拉帮结派形成属于自己的部落,不同的部落之间则经常发生争斗.只是,这一切都成 ...

  8. 题解 洛谷 P4047 【[JSOI2010]部落划分】

    我觉得几乎就是一道最小生成树模板啊... 题解里许多大佬都说选第n-k+1条边,可我觉得要这么讲比较容易理解 (虚边为能选的边,实边为最小生成树) 令n=5,k=2,(1,3)<(1,2)< ...

  9. BZOJ1821:[JSOI2010]部落划分(并查集,二分)

    Description 聪聪研究发现,荒岛野人总是过着群居的生活,但是,并不是整个荒岛上的所有野人都属于同一个部落,野人们总是拉帮结派形成属于自己的部落,不同的部落之间则经常发生争斗.只是,这一切都成 ...

随机推荐

  1. VINS(一)简介与代码结构

    VINS-Mono和VINS-Mobile是香港科技大学沈劭劼团队开源的单目视觉惯导SLAM方案.是基于优化和滑动窗口的VIO,使用IMU预积分构建紧耦合框架.并且具备自动初始化,在线外参标定,重定位 ...

  2. Myeclipse - 问题集 - specified vm install not found

    In Eclipse, click the ant file -- Run As -- External Tools Configuration and click on the JRE tab. S ...

  3. sqlserver 循环赋值变量

    sql server 是可以用 @变量 +=值的: 第一:必须在循环里面, 第二: 必须在循环外面初始化变量的值 如:  @变量=''; 这样才能循环给值

  4. 2019年猪年海报PSD模板-第五部分

    14套精美猪年海报,免费猪年海报,下载地址:百度网盘,https://pan.baidu.com/s/1CuZKPmFbbSBvzSXoCt2few                

  5. Windows运行机理——窗口句柄和消息

    Windows运行机理这系列文章都是来至于<零基础学Qt4编程>——吴迪,个人觉得写得很好,所以进行了搬运和个人加工 现在我们将消息与句柄联系起来.假如有一个窗口,且拥有该窗口的一个句柄( ...

  6. 接口测试工具postman(八)上传文件接口

    涉及到选择文件的接口,在[Body]页签下,key选择File选项,会显示“选择文件”按钮,选择本地的文件

  7. PyCharm 2018 最新激活方式总结(最新最全最有效)!!!

    PyCharm 2018 最新激活方式总结(最新最全最有效!!!) pycharm2018 是目前python编程的主要应用工具,具有非常广泛的应用,不过对于它的破解一直比较麻烦,这里我为大家提供了三 ...

  8. 初学Direct X(9) ——文字的显示

    初学Direct X(9) --文字的显示 本次学习如何使用ID3DXFont创建字体,使得我们可以在任何安装了Windows系统中TrueType字体来打印文字,不过最好使用标准字体,这样文字在每一 ...

  9. Swift使用AVAudioPlayer来调节游戏的背景音乐大小

    音乐文件的声音大小有时在做为游戏背景音乐时会过大,而如果我们只是简单应用SKAudioNode来加载音乐的话,是无法进行声音大小的调节的,因此我们必须使用更强大的AVAudioPlayer来进行声音大 ...

  10. 【token接口】-jmeter

    token 接口 3步骤 1.登录接口 2.提取登录接口的token 3.http 信息管理头   把提取的cookie传入  就可以了