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

只是,这一切都成为谜团了——聪聪根本就不知道部落究竟是如何分布的。

不过好消息是,聪聪得到了一份荒岛的地图。

地图上标注了 N 个野人居住的地点(可以看作是平面上的坐标)。

我们知道,同一个部落的野人总是生活在附近。

我们把两个部落的距离,定义为部落中距离最近的那两个居住点的距离。

聪聪还获得了一个有意义的信息——这些野人总共被分为了 K 个部落!

这真是个好消息。

聪聪希望从这些信息里挖掘出所有部落的详细信息。

他正在尝试这样一种算法:

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

例如,下面的左图表示了一个好的划分,而右图则不是。

请你编程帮助聪聪解决这个难题。

1.jpg

输入格式
第一行包含两个整数 N 和 K,分别代表了野人居住点的数量和部落的数量。

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

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

数据范围
1≤N≤1000,
1<K≤N,
0≤x,y≤10000
输入样例:

4 2
0 0
0 1
1 1
1 0

输出样例:

1.00

思路:

二分代码:

#include<iostream>
#include<map>
#include<cmath>
#include<cstring>
#include<queue>
using namespace std;
typedef pair<int,int>PII;
const int N=1e6+10;
PII g[N];
int n,k;
int fa[N];
double dist[1005][1005];
double get_dis(PII a,PII b)
{return sqrt(pow(a.first-b.first,2)+pow(a.second-b.second,2));
}
int find(int x)
{if(x==fa[x]){return x;}else{return fa[x]=find(fa[x]);}
}
bool check(double mid)
{for(int i=1;i<=n;i++){fa[i]=i;}int t=0;for(int i=1;i<=n;i++){for(int j=1;j<=n;j++){if(i!=j){if(dist[i][j]<=mid){int a=find(i);int b=find(j);fa[a]=b;}}}}for(int i = 1; i <= n ; i++) if(fa[i] == i) t++;if(t>=k){return true;}return false;
}
int main()
{cin>>n>>k;for(int i=1;i<=n;i++){cin>>g[i].first>>g[i].second;}for(int i=1;i<=n;i++){for(int j=1;j<=n;j++){if(i==j){dist[i][j]=0;}else {dist[i][j]=get_dis(g[i],g[j]);}}}double r=1e4;double l=0.0;while(l+0.00001<=r){double mid=(l+r)/2.0;if(check(mid)){l=mid;}else{r=mid;}}printf("%0.2lf",r);
}

最小生成树代码:

#include<iostream>
#include<cstring>
#include<algorithm>
#include<cmath>
using namespace std;
typedef pair<int,int>PII;
const int N=1e6+10;
struct Edge
{int u,v;double w;bool operator < (const Edge & t) const{if(w<t.w){return true;}return false;}
}edge[N];
int n,k;
int fa[N];
pair<int,int> g[N];
double get_dis(PII a, PII b)
{return sqrt(pow(a.first - b.first, 2) + pow(a.second - b.second,2));
}
double res=0;
int find(int x)
{if(x==fa[x]){return x;}else{return fa[x]=find(fa[x]);}
}
int main()
{cin>>n>>k;for(int i=0;i<n;i++){int a,b;cin>>a>>b;g[i]={a,b};}for(int i=0;i<n;i++){fa[i]=i;}int cnt=0;for(int i=0;i<n;i++){for(int j=0;j<n;j++){if(i==j){continue;}edge[cnt++]={i,j,get_dis(g[i], g[j])};}}sort(edge,edge+cnt);int num=n;for(int i=0;i<cnt;i++){int u=edge[i].u;int v=edge[i].v;int a=find(u);int b=find(v);if(a!=b){fa[a]=b;num--;}if(num==k-1){printf("%.2lf",edge[i].w);return 0;}}printf("%0.2lf",res);
}

Acwing 2382. 部落划分相关推荐

  1. BZOJ 1821: [JSOI2010]Group 部落划分 Group【MST】

    1821: [JSOI2010]Group 部落划分 Group Time Limit: 10 Sec Memory Limit: 64 MB Description 聪聪研究发现,荒岛野人总是过着群 ...

  2. bzoj 1821: [JSOI2010]Group 部落划分

    1821: [JSOI2010]Group 部落划分 Time Limit: 10 Sec  Memory Limit: 64 MB Submit: 2484  Solved: 1165 [Submi ...

  3. 【c++图论】【口袋的天空】【部落划分】

    目标: 今天的两道题做法和思路有相同之处,合并在一起学习可以帮助更快的掌握图论中克鲁斯卡尔算法的要点和据具体实现步骤,下面来看看题目: 第一题[口袋的天空] 题目如下 题目背景 小杉坐在教室里,透过口 ...

  4. C++之路进阶——bzoj1821(部落划分)

    F.A.Qs Home Discuss ProblemSet Status Ranklist Contest ModifyUser   hyxzc Logout 捐赠本站 Notice:1:由于本OJ ...

  5. AcWing 900. 整数划分(完全背包计数问题)

    题目链接 https://www.acwing.com/problem/content/description/902/ 思路 对于从[1,n][1,n][1,n]的每一个数我们能做的操作是选或者不选 ...

  6. bzoj 1821 部落划分

    评测:http://www.lydsy.com/JudgeOnline/problem.php?id=1821 分析一下题目: 因为最后答案是距离最近的部落的距离最远,即尽量把短的边合并进部落中. 一 ...

  7. BZOJ 1821 [JSOI2010] Group 部落划分 Group

    最小生成森林? 个人感觉跟最小生成树差不多.需要分成k个联通块,让联通块之间距离最大就让联通块内距离尽可能小.一颗最小生成树是N-1条边,分成k个块需要切k-1条,就是一个n-k条边的最小生成森林,然 ...

  8. BZOJ1821 [JSOI2010]Group 部落划分 Group Kruskal

    欢迎访问~原文出处--博客园-zhouzhendong 去博客园看该题解 题目传送门 - BZOJ1821 题意概括 平面上有n个点,现在把他们划分成k个部分,求不同部分之间最近距离的最大值. 两个部 ...

  9. P4047-[JSOI2010]部落划分【最小生成树】

    正题 题目链接:https://www.luogu.org/problemnew/show/P4047 题目大意 将nnn个点分成kkk个部分,使得最近的两个部分的距离尽可能远. 解题思路 最小生成树 ...

最新文章

  1. Android中的BuildConfig类怎么来的
  2. QT的QReadLocker类的使用
  3. LeetCode Algorithm 1. 两数之和
  4. MVC学习IIS的不同版本(一)
  5. python网络爬虫系列(二)——ProxyHandler处理器实现代理IP
  6. 线性表的链式存储集成
  7. Spring Boot + SpringSecurity + JWT 实现简单的 restful Api 权限控制
  8. 【体系结构】Oracle的kernel.shmmax和kernel.shmall设置
  9. Apache和Tomcat的区别与联系
  10. Java 谷歌翻译 api 调用
  11. SVN版本库备份和恢复
  12. element-ui轮播图片显示问题
  13. 第十三课:树莓派搭建客户端
  14. iOS 使用TestFlight进行App外部测试
  15. 推荐几款好用的书签收藏夹插件-让我们可以稍后阅读
  16. 让文字功力从优秀走向精致——25位专业人士的写作心得
  17. 单枪匹马想要搞定亿级流量?2021阿里都换成这个牛逼架构了
  18. ps ps aux 和ps -aux和 ps -ef的选择
  19. mysql怎么创建信息表_怎么在MySQL创建表
  20. 域名备案审核需要多长时间?企业网站需要准备哪些材料?

热门文章

  1. 一张图遍历中外历史事件、科学发明、哲学思想对照表
  2. linux 什么是源代码目录结构,Linux源代码目录树结构Linux -电脑资料
  3. 最小摩托车433胎压监测模块集成方案
  4. 谷歌求职记:我花了八个月准备谷歌面试
  5. 生活网络常识—CAT1与CAT4的区别
  6. jpg转换成pdf转换器中文版推荐
  7. 商城项目(四)整合SpringTask实现定时任务
  8. C++ primer 第8章 IO库 思维导图
  9. CAD2019中创建基于3D图当前视图所有对象的二维表示
  10. 使用onclick改变元素的显示和隐藏