题解 洛谷 P4047 【[JSOI2010]部落划分】
我觉得几乎就是一道最小生成树模板啊...
题解里许多大佬都说选第n-k+1条边,可我觉得要这么讲比较容易理解

(虚边为能选的边,实边为最小生成树)
令n=5,k=2,(1,3)<(1,2)<(3,4)<(4,5)(PS:(4,5)<(2,5),图画错了,见谅)
然后开始分部落(被同一个三角形套住的为一个部落的):
(1)

这样肯定不为最优部落划分,因为他们的距离为(1,3)
(2)

同理,这样也不行
(3)

这样当然是不行的
所以,我们得出了这样一个结论:
要尽量选大边
所以小边要尽量在一个部落里,即下图:

又因为有k个部落,所以可以消掉(n-1)-(k-1)条边,所以最小的为第n-k+1条边,所以就输出a[n-k+1]
代码如下:
#include<cstdio>
#include<algorithm>
#include<cmath>
using namespace std;
inline int read(){
int r=,f=;
char c=getchar();
while(c<''||c>''){if(c=='-')f=-,c=getchar();}
while(c>=''&&c<='')r=(r<<)+(r<<)+c-'',c=getchar();
return r*f;
}
struct E{
int u,v;
double dis;//记得为double
}e[];
int f[],s_e,n,m;
int find(int x){
if(f[x]!=x)f[x]=find(f[x]);
return f[x];
}
inline bool cmp(E a,E b){
return a.dis<b.dis;
}
double a[];//记得为double
int x[],y[];
int main(){
n=read(),m=read();
for(int i=;i<=n;i++)f[i]=i,x[i]=read(),y[i]=read();
for(int i=;i<=n;i++)
for(int j=;j<i;j++){
s_e++;
e[s_e].u=i;
e[s_e].v=j;
e[s_e].dis=(double)sqrt((x[i]-x[j])*(x[i]-x[j])+(y[i]-y[j])*(y[i]-y[j]));//计算sqrt((x1-x2)^2+(y1-y2)^2),即距离
}
sort(e+,e++s_e,cmp);//最小生成树
int i=;
int j=;
while(j<n-){
int fu=find(e[i].u),fv=find(e[i].v);
double dis=e[i].dis;//记得为double
if(fu!=fv){
f[fu]=fv;
j++;
a[j]=dis;//记得为double
}
i++;
}
printf("%.2lf",a[n-m+]);//记得是小数点后两位两位
return ;
}
题解 洛谷 P4047 【[JSOI2010]部落划分】的更多相关文章
- 洛谷P4047 [JSOI2010]部落划分题解
洛谷P4047 [JSOI2010]部落划分题解 题目描述 聪聪研究发现,荒岛野人总是过着群居的生活,但是,并不是整个荒岛上的所有野人都属于同一个部落,野人们总是拉帮结派形成属于自己的部落,不同的部落 ...
- 洛谷 P4047 [JSOI2010]部落划分
这道题其实就是无线通讯网的双倍经验啦,只是在输出的时候不同罢了.还是一样的\(kruskal\)算法,但是在求的时候,应该在\(now=n-k+1\)的时候结束.本来到\(n-k\)就行了的,但是由于 ...
- P4047 [JSOI2010]部落划分 方法记录
原题链接 [JSOI2010]部落划分 题目描述 聪聪研究发现,荒岛野人总是过着群居的生活,但是,并不是整个荒岛上的所有野人都属于同一个部落,野人们总是拉帮结派形成属于自己的部落,不同的部落之间则经常 ...
- P4047 [JSOI2010]部落划分(最小生成树)
题目描述 聪聪研究发现,荒岛野人总是过着群居的生活,但是,并不是整个荒岛上的所有野人都属于同一个部落,野人们总是拉帮结派形成属于自己的部落,不同的部落之间则经常发生争斗.只是,这一切都成为谜团了——聪 ...
- P4047 [JSOI2010]部落划分
显然二分答案\(mid\),然后距离\(\leq mid\)的点对只能放在一个部落里.然后可以并查集\(O(n^2)\)算出有多少个部落. // luogu-judger-enable-o2 #inc ...
- P4047 [JSOI2010]部落划分 并查集
思路:并查集+生成树 提交:2次(虽然样例都没过但感觉是对的$QwQ$(判边少了一条)) 题解: 把所有点之间连边,然后$sort$一遍,从小往大加边,直到连第$n-k+1$条边(相当于是破话$k$个 ...
- 【BZOJ1821】[JSOI2010]部落划分(二分,并查集)
[BZOJ1821][JSOI2010]部落划分(二分,并查集) 题面 BZOJ 洛谷 题解 二分答案,把距离小于二分值的点全部并起来,\(\mbox{check}\)一下是否有超过\(K\)个集合就 ...
- 洛谷 1821: [JSOI2010]Group 部落划分 Group
1821: [JSOI2010]Group 部落划分 Group Time Limit: 10 Sec Memory Limit: 64 MBSubmit: 2596 Solved: 1221[S ...
- BZOJ 1821 JSOI2010 部落划分 Group prim
Description 聪聪研究发现,荒岛野人总是过着群居的生活,但是,并不是整个荒岛上的所有野人都属于同一个部落,野人们总是拉帮结派形成属于自己的部落,不同的部落之间则经常发生争斗.只是,这一切都成 ...
随机推荐
- git--客户端管理工具初步使用
说点废话哈 小白一枚, 今年3月份进入自己的第一家公司, 开始成为前端中的一份子,好在公司里有位和我一同进来的一位老哥带着我,从老哥身上学到的知识不多,(因为和老哥只相处工作了三个月,因为家里的事情, ...
- 中山纪念中学培训杂题(难的都不在这里面qwq)
来中山纪中半个月了,差不多就要结束了, 写一些之前考试能更正的题解吧,还有一些不是给人做的(比如IOI2018互测.. 备注:我不会的就没有放上来了,所有数学有关的基本上都死了. 所以这里的题目都是相 ...
- css不定高度实现垂直居中
1.不知道自己高度和父容器高度的情况下, 利用绝对定位只需要以下三行: parentElement{ position:relative; } childElement{ position: abso ...
- 关于@SuppressWarnings("unchecked")注解
解释一: 屏蔽某些编译时的警告信息 在强制类型转换的时候编译器会给出警告 加上程序代码 @SuppressWarnings("unchecked& ...
- DQL查询语句使用(select)
9)DQL查询语句使用 SELECT语句在PL/SQL中使用,必须 采用下面用法: select id INTO 变量 from t001 where id=5; 将记录字段 ...
- java--web学习总结<转>
http://www.cnblogs.com/xdp-gacl/p/3729033.html
- NYIST 1107 最高的奖励
最高的奖励 时间限制:1000 ms | 内存限制:65535 KB 难度:3 描述 请问:挖掘机技术哪家强?AC了告诉你! 给你N(N<=3*10^4)个任务,每个任务有一个截止完成时 ...
- LaTeX 图片色偏解决方法
本系列文章由 @YhL_Leo 出品,转载请注明出处. 文章链接: http://blog.csdn.net/yhl_leo/article/details/50327113 在LaTeX的编辑模式中 ...
- HDU 2879
利用x<n的信息,可以证得当n为素数时,he[n]=2;同时,若n 为素数,则有HE[N^K]=2;因为若等式成立则有n|x(x-1).抓住这个证即可. 至于符合积性函数,想了很久也没想出来,看 ...
- mysql字符集修改(ubuntu)
1.关闭mysql服务 /etc/init.d/mysql start|stop 2.在/etc/mysql/my.cnf,添加下列信息 [client] default-character-set= ...