P4047 [JSOI2010]部落划分(最小生成树)
题目描述
聪聪研究发现,荒岛野人总是过着群居的生活,但是,并不是整个荒岛上的所有野人都属于同一个部落,野人们总是拉帮结派形成属于自己的部落,不同的部落之间则经常发生争斗。只是,这一切都成为谜团了——聪聪根本就不知道部落究竟是如何分布的。
不过好消息是,聪聪得到了一份荒岛的地图。地图上标注了N个野人居住的地点(可以看作是平面上的坐标)。我们知道,同一个部落的野人总是生活在附近。我们把两个部落的距离,定义为部落中距离最近的那两个居住点的距离。聪聪还获得了一个有意义的信息——这些野人总共被分为了K个部落!这真是个好消息。聪聪希望从这些信息里挖掘出所有部落的详细信息。他正在尝试这样一种算法:
对于任意一种部落划分的方法,都能够求出两个部落之间的距离,聪聪希望求出一种部落划分的方法,使靠得最近的两个部落尽可能远离。
例如,下面的左图表示了一个好的划分,而右图则不是。请你编程帮助聪聪解决这个难题。
输入输出格式
输入格式:
输入文件第一行包含两个整数N和K(1<=N<=1000,1<K<=N),分别代表了野人居住点的数量和部落的数量。
接下来N行,每行包含两个正整数x,y,描述了一个居住点的坐标(0<=x, y<=10000)。
输出格式:
输出一行,为最优划分时,最近的两个部落的距离,精确到小数点后两位。
输入输出样例
9 3
2 2
2 3
3 2
3 3
3 5
3 6
4 6
6 2
6 3
解题报告:
题目大意:给定n<=1000个点,使其形成K个联通块,且联通块里两两点之间距离最近,请求出最近的两个联通块的距离
用Kruskal算法,直到出现k个联通块为止。
并查集每次合并操作都会使得图中减少一个联通块
相当于我们把最小的那些边都分给了部落内部,所以最大化了部落之间的距离
#include<bits/stdc++.h> #define N 1005
using namespace std; int n,m,x[N],y[N],tot,fa[N],cnt;
struct node{
int x,y;
double d;
}e[N*N]; double dis(int x,int xx,int y,int yy){
return sqrt((x-xx)*(x-xx)+(y-yy)*(y-yy));
} int find(int u){return fa[u]==u?u:find(fa[u]);} bool cmp(node A,node B){
return A.d<B.d;
} int main()
{
scanf("%d%d",&n,&m);
for(int i=;i<=n;i++) scanf("%d%d",&x[i],&y[i]),fa[i]=i;
for(int i=;i<=n;i++){
for(int j=i+;j<=n;j++){
e[++tot].x=i;e[tot].y=j;e[tot].d=dis(x[i],x[j],y[i],y[j]);
}
}sort(e+,e++tot,cmp);
for(int i=;i<=tot;i++){
int fx=find(e[i].x),fy=find(e[i].y);
if(fx==fy) continue;
fa[fx]=fy;++cnt;
if(cnt==n-m+){
printf("%.2lf",e[i].d);
break;
}
}return ;
}
P4047 [JSOI2010]部落划分(最小生成树)的更多相关文章
- 洛谷P4047 [JSOI2010]部落划分题解
洛谷P4047 [JSOI2010]部落划分题解 题目描述 聪聪研究发现,荒岛野人总是过着群居的生活,但是,并不是整个荒岛上的所有野人都属于同一个部落,野人们总是拉帮结派形成属于自己的部落,不同的部落 ...
- P4047 [JSOI2010]部落划分 方法记录
原题链接 [JSOI2010]部落划分 题目描述 聪聪研究发现,荒岛野人总是过着群居的生活,但是,并不是整个荒岛上的所有野人都属于同一个部落,野人们总是拉帮结派形成属于自己的部落,不同的部落之间则经常 ...
- [JSOI2010]部落划分 最小生成树
一道最小生成树经典题 由于是最靠近的两个部落尽可能远,如果我们先处理出任意两个居住点之间的距离并将其当做边,那么我们可以发现,因为在一个部落里面的边是不用计入答案的,所以应该要尽量把小边放在一个部落里 ...
- P4047 [JSOI2010]部落划分
显然二分答案\(mid\),然后距离\(\leq mid\)的点对只能放在一个部落里.然后可以并查集\(O(n^2)\)算出有多少个部落. // luogu-judger-enable-o2 #inc ...
- luogu 4047 [JSOI2010]部落划分 最小生成树
最小生成树或者二分都行,但是最小生成树会好写一些~ Code: #include <bits/stdc++.h> #define ll long long #define N 100000 ...
- 洛谷 P4047 [JSOI2010]部落划分
这道题其实就是无线通讯网的双倍经验啦,只是在输出的时候不同罢了.还是一样的\(kruskal\)算法,但是在求的时候,应该在\(now=n-k+1\)的时候结束.本来到\(n-k\)就行了的,但是由于 ...
- P4047 [JSOI2010]部落划分 并查集
思路:并查集+生成树 提交:2次(虽然样例都没过但感觉是对的$QwQ$(判边少了一条)) 题解: 把所有点之间连边,然后$sort$一遍,从小往大加边,直到连第$n-k+1$条边(相当于是破话$k$个 ...
- 【BZOJ1821】[JSOI2010]部落划分(二分,并查集)
[BZOJ1821][JSOI2010]部落划分(二分,并查集) 题面 BZOJ 洛谷 题解 二分答案,把距离小于二分值的点全部并起来,\(\mbox{check}\)一下是否有超过\(K\)个集合就 ...
- 题解 洛谷 P4047 【[JSOI2010]部落划分】
我觉得几乎就是一道最小生成树模板啊... 题解里许多大佬都说选第n-k+1条边,可我觉得要这么讲比较容易理解 (虚边为能选的边,实边为最小生成树) 令n=5,k=2,(1,3)<(1,2)< ...
随机推荐
- vmware 10虚拟机安装ubuntu server 14.04
-開始安装ubuntu server- 1.首先是安装系统时的语言,推荐选择English 然后安装系统 这里选择语言非常重要,我開始选择了中文,安装完毕后会乱码,所以推荐选择英文 由于在中国.所以选 ...
- TensorFlow 官方文档中文版
http://wiki.jikexueyuan.com/list/deep-learning/ TensorFlow 官方文档中文版 你正在阅读的项目可能会比 Android 系统更加深远地影响着世界 ...
- click事件触发也有失灵的时候?
今天做了个手机页面,点击某个按钮->弹出菜单,再点击菜单以外的任意位置->关闭菜单,在其他浏览器里面没有问题,但是在IOS浏览器中并不会关闭. 网上解决这个bug的帖子很多,这篇帖子主要是 ...
- luogu 3415 祭坛
题目大意: 在平面上,有 n 个水晶柱,每个水晶柱可以用一个点表示 如果 4 个水晶柱依次相连可以构成一个四边形,满足其两条对角线分别平行于 x 轴和 y 轴,并且对角线的交点位于四边形内部(不包括边 ...
- 【POJ 3614】 Sunscreen
[题目链接] http://poj.org/problem?id=3614 [算法] 将MinSPF从大到小排序,每头牛找SPF值最大的防晒霜 [代码] #include <algorithm& ...
- bzoj2142 礼物——扩展卢卡斯定理
题目:https://www.lydsy.com/JudgeOnline/problem.php?id=2142 前几天学了扩展卢卡斯定理,今天来磕模板! 这道题式子挺好推的(连我都自己推出来了) , ...
- 【洛谷4219】[BJOI2014]大融合(线段树分治)
题目: 洛谷4219 分析: 很明显,查询的是删掉某条边后两端点所在连通块大小的乘积. 有加边和删边,想到LCT.但是我不会用LCT查连通块大小啊.果断弃了 有加边和删边,还跟连通性有关,于是开始yy ...
- 阿里邮箱绑定Foxmail失败的解决办法
收件服务器地址: POP 服务器地址:pop3.mxhichina.com 端口110,SSL 加密端口995 或 IMAP 服务器地址:imap.mxhichina.com 端口143,SSL 加密 ...
- day03_12/13/2016_bean的管理之作用域与初始化时间
在Spring中,Bean有几种作用域: 1.singleton作用域 当一个bean的作用域设置为singleton,那么Spring IOC容器中只会存在一个共享的bean实例,并且所有对bean ...
- Hadoop基础(一)
Hadoop 基础知识 大数据已经火了很长很长时间了,从最开始是个公司都说自己公司的数据量很大,我们在搞大数据.到现在大数据真的已经非常成熟并且已经在逐渐的影响我们的生产生活.你可能听过支付宝的金融大 ...