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

题目描述

聪聪研究发现,荒岛野人总是过着群居的生活,但是,并不是整个荒岛上的所有野人都属于同一个部落,野人们总是拉帮结派形成属于自己的部落,不同的部落之间则经常发生争斗。只是,这一切都成为谜团了——聪聪根本就不知道部落究竟是如何分布的。

不过好消息是,聪聪得到了一份荒岛的地图。地图上标注了N个野人居住的地点(可以看作是平面上的坐标)。我们知道,同一个部落的野人总是生活在附近。我们把两个部落的距离,定义为部落中距离最近的那两个居住点的距离。聪聪还获得了一个有意义的信息——这些野人总共被分为了K个部落!这真是个好消息。聪聪希望从这些信息里挖掘出所有部落的详细信息。他正在尝试这样一种算法:

对于任意一种部落划分的方法,都能够求出两个部落之间的距离,聪聪希望求出一种部落划分的方法,使靠得最近的两个部落尽可能远离。

例如,下面的左图表示了一个好的划分,而右图则不是。请你编程帮助聪聪解决这个难题。

输入输出格式

输入格式:

输入文件第一行包含两个整数N和K(1<=N<=1000,1<K<=N),分别代表了野人居住点的数量和部落的数量。

接下来N行,每行包含两个正整数x,y,描述了一个居住点的坐标(0<=x, y<=10000)。

输出格式:

输出一行,为最优划分时,最近的两个部落的距离,精确到小数点后两位。

输入输出样例

输入样例#1:

4 2
0 0
0 1
1 1
1 0
输出样例#1:

1.00
输入样例#2:

9 3
2 2
2 3
3 2
3 3
3 5
3 6
4 6
6 2
6 3
输出样例#2:

2.00

解析:
   

输入所有的点的坐标,然后就枚举记录每一个点到另外其他点的距离,注意要用double类型.
然后就排一个序,我这里是用结构体重载运算符,先从最小的开始合并并查集,并把这个边设为一个极大值,注意要把其他的点也要合并,就是说for循环一遍把所有在一个部落里的点与点之间的距离也设为一个极大值.
最后就在所有的边中取一个最小值,该值即为所值.

 #include <cstdio>
#include <iostream>
#include <cstdlib>
#include <queue>
#include <cstring>
#include <stack>
#include <cmath>
#include <algorithm>
#include <iomanip>
#include <ctime>
#define INF 0x7fffffff
#define Max 1000025
inline int read()
{
int s=,f=;
char ch=getchar();
while(ch<''||ch>'') { if(ch=='-') f=-; ch=getchar();}
while(ch>=''&&ch<='') s=s*+ch-'',ch=getchar();
return s*f;
}
int n,k,pa[Max],x[Max],y[Max],ID[Max];
int find(int x)
{
if(x!=pa[x])
pa[x]=find(pa[x]);
return pa[x];
}
void add(int x,int y)
{
x=find(x);y=find(y);
pa[y]=x;
}
#define D double
D d(int x_1,int y_1,int x_2,int y_2)
{
return (D)sqrt((x_1-x_2)*(x_1-x_2) + (y_1-y_2)*(y_1-y_2));
}
struct point
{
int x,y;
D dis;
friend bool operator<(point a,point b) {
return a.dis<b.dis;
}
}t[Max];
int main()
{
// freopen("Group.in","r",stdin);
// freopen("Group.out","w",stdout);
n=read();k=read();
for(int i = ; i <= n ; ++ i)
pa[i]=i;
for(int i = ; i <= n ; ++ i)
x[i]=read(),y[i]=read(),ID[i]=i;
int num=;
for(int i = ; i <= n ; ++ i)
for(int j = ; j <= n ; ++ j)
if(i!=j) {
t[++num].dis=d(x[i],y[i],x[j],y[j]);
t[num].x=ID[i];t[num].y=ID[j];
}
int m=n;
D Min=INF;
std::sort(t+,t++num);
for(int i = ; i <= num ; ++ i) {
int x=find(t[i].x),y=find(t[i].y);
if(x!=y)
add(x,y),m--,t[i].dis=INF*1.00;
if(m==k)
break;
}
for(int i = ; i <= num ; ++ i)
if(find(t[i].x)==find(t[i].y))
t[i].dis=INF*1.0;
for(int i = ; i <= num ; ++ i)
Min=std::min(Min,t[i].dis);
printf("%.2lf",Min);
return ;
}

AC代码

洛谷P4047 [JSOI2010]部落划分题解的更多相关文章

  1. 洛谷 P4047 [JSOI2010]部落划分

    这道题其实就是无线通讯网的双倍经验啦,只是在输出的时候不同罢了.还是一样的\(kruskal\)算法,但是在求的时候,应该在\(now=n-k+1\)的时候结束.本来到\(n-k\)就行了的,但是由于 ...

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

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

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

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

  4. P4047 [JSOI2010]部落划分

    显然二分答案\(mid\),然后距离\(\leq mid\)的点对只能放在一个部落里.然后可以并查集\(O(n^2)\)算出有多少个部落. // luogu-judger-enable-o2 #inc ...

  5. P4047 [JSOI2010]部落划分 并查集

    思路:并查集+生成树 提交:2次(虽然样例都没过但感觉是对的$QwQ$(判边少了一条)) 题解: 把所有点之间连边,然后$sort$一遍,从小往大加边,直到连第$n-k+1$条边(相当于是破话$k$个 ...

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

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

  7. 洛谷P1783 海滩防御 分析+题解代码

    洛谷P1783 海滩防御 分析+题解代码 题目描述: WLP同学最近迷上了一款网络联机对战游戏(终于知道为毛JOHNKRAM每天刷洛谷效率那么低了),但是他却为了这个游戏很苦恼,因为他在海边的造船厂和 ...

  8. 洛谷P1155 双栈排序题解(图论模型转换+二分图染色+栈)

    洛谷P1155 双栈排序题解(图论模型转换+二分图染色+栈) 标签:题解 阅读体验:https://zybuluo.com/Junlier/note/1311990 原题地址:洛谷P1155 双栈排序 ...

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

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

随机推荐

  1. 多次执行echarts时出现 there is a chart instance already initialized on the dom

    原因,多次使用 echarts.init(document.getElementById(this.options.zid)); 解决方案 设为全局

  2. jquery跨js文件调用函数示例

    var common_func; (function() { common_func = { load_hot_data: function(AreaCode) { var hot_html = &q ...

  3. Vert.x 异步访问数据库 MySQL

    Vert.x提供异步访问数据库的API,数据库操作是一个耗时操作,使用传统的同步模型,容易阻塞线程,导致整体性能下降,因此我们对于数据库操作,需要使用Vert.x提供的异步API. Vert.x提供的 ...

  4. JavaScript实现网页回到顶部效果

    在浏览网页时,当我们浏览到网页底部,想要立刻回到网页顶部时,这时候一般网页会提供一个回到顶部的按钮来提升用户体验,以下代码实现了该功能 HTML代码: <p id="back-top& ...

  5. php xml解析

    XML处理是开发过程中经常遇到的,PHP对其也有很丰富的支持,本文只是对其中某几种解析技术做简要说明,包括:Xml parser, SimpleXML, XMLReader, DOMDocument. ...

  6. springboot多环境下maven打包

    前言: 最近在项目中使用springboot时发现,采用在pom中定义不同的profile,并且maven打包时 采用-P参数并不能替换我application.properties文件中指定占位符的 ...

  7. IntelliJ IDEA快速自动生成Junit测试类

    1.背景 测试是保证代码必不可少的环节,自己构建测试方法太慢,并且命名也不规范,idea中提供了,一键构建测试结构的功能...废话不多说,直接写步骤 2.步骤 1.在需要做测试的类的当前窗口,直接按快 ...

  8. 【TTS】传输表空间AIX asm -> linux asm

    [TTS]传输表空间AIX asm -> linux asm 一.1  BLOG文档结构图       一.2  前言部分   一.2.1  导读和注意事项 各位技术爱好者,看完本文后,你可以掌 ...

  9. css浮动float详解

    https://www.cnblogs.com/iyangyuan/archive/2013/03/27/2983813.html

  10. PHP、JS 中 encode/decode

    PHP : urlencode() urldecode() JS : encodeURIComponent() decodeURIComponent() 同一字符串,编码后的结果一样 1