题解 洛谷 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 聪聪研究发现,荒岛野人总是过着群居的生活,但是,并不是整个荒岛上的所有野人都属于同一个部落,野人们总是拉帮结派形成属于自己的部落,不同的部落之间则经常发生争斗.只是,这一切都成 ...
随机推荐
- Day 02 - 01 计算机的操作系统
操作系统 场景:有以下三个人 1.庄园主 -->相当于人类 2.管家 --> 把人类要传达的信息分配给奴隶,相当于操作系统 3.奴隶 -->为人类干活的机器 1.操作系统做了什么? ...
- python安装Redis数据库
where pip cd 切换这个目录 pip install redis import redis r = redis.Redis(host='127.0.0.1', port=6379) user ...
- js正则表达式注册页面表单验证
可以这样校验 <html> <head> <meta http-equiv="Content-Type" content="text/htm ...
- ubuntu 12.04下安装Qt出现cannot execute binary file的解决方案
最近在ubuntu 12.04下安装QT的过程中,遇到一个问题. ./qt-opensource-linux-x64-5.7.0.run出现了bash: ./qt-opensource-linux-x ...
- jquery中的jsonp跨域调用(接口)
jquery jsonp跨域调用接口
- 【codeforces 810A】Straight «A»
[题目链接]:http://codeforces.com/contest/810/problem/A [题意] 有n门课的成绩,和一个整数k代表每门课的满分都是k分; 然后这n门课的成绩是按照平均分算 ...
- Spring IoC简介及使用
Spring根本任务 Spring的根本任务就是简化Java开发. 目前许多框架如果要使用他们,就必须要继承或实现这些框架的各种类.这使得框架与我们的程序耦合度过高.由于在我们的程序中加入了过多的框架 ...
- hbase的几种访问方式
Hbase的访问方式 1.Native Java API:最常规和高效的访问方式: 2.HBase Shell:HBase的命令行工具,最简单的接口,适合HBase管理使用: 3.Thrift Gat ...
- ASP.NET-dropdownlist默认值
可以在第三个选项中定义一个默认值,但是返回数据的时候就不需要这种类似"请选择名称"之类的提示了,所以在构造seleclt option的时候,要在option中的属性中加上sele ...
- 洛谷 P3133 [USACO16JAN]无线电联系Radio Contact
P3133 [USACO16JAN]无线电联系Radio Contact 题目描述 Farmer John has lost his favorite cow bell, and Bessie the ...