【bzoj1821】 JSOI2010Group 部落划分 二分+并查集
2015-10-20 17:37
609 查看
首先二分一下答案,然后距离小于答案的点对暴力连边,并查集判断即可。
#include<cstdio> #include<cstring> #include<cstdlib> #include<cmath> #include<iostream> #include<algorithm> #define eps 1e-5 #define maxn 1010 using namespace std; int x[maxn],y[maxn]; int f[maxn]; bool vis[maxn]; int n,k; double dis(int i,int j) { return sqrt((double)(x[i]-x[j])*(x[i]-x[j])+(double)(y[i]-y[j])*(y[i]-y[j])); } int find(int x) { if (f[x]==x) return x; else return f[x]=find(f[x]); } int check(double x) { memset(vis,0,sizeof(vis)); for (int i=1;i<=n;i++) f[i]=i; for (int i=1;i<=n;i++) for (int j=1;j<=n;j++) if (i!=j && dis(i,j)<x) { int f1=find(i),f2=find(j); if (f1!=f2) f[f1]=f2; } int num=0; for (int i=1;i<=n;i++) if (!vis[find(i)]) vis[find(i)]=1,num++; return num; } int main() { scanf("%d%d",&n,&k); for (int i=1;i<=n;i++) scanf("%d%d",&x[i],&y[i]); double l=0,r=10000000000; while (r-l>eps) { double mid=(l+r)/2.0; if (check(mid)<k) r=mid; else l=mid; } printf("%.2lf\n",l); return 0; }
相关文章推荐
- 深入解析JavaScript的闭包机制
- 【学习笔记javascript设计模式与开发实践(单例模式)----4】
- Javascript中的数据类型之旅
- JavaScript 核心参考教程 内置对象
- 了解 JavaScript 中的内置对象
- javascript面向对象方式,调用属性和方法
- w3school js 测验
- JavaScript知识(一直更新)
- JavaScript基本的输出和嵌入式写法教程
- js编写快速排序
- 类(2)---Javascript定义类(class)的三种方法
- 自己寫的 Loading JS插件
- 类(1)---几种常用的JS类定义方法
- js队列和堆栈
- select 框option添加属性 js计算价格 保持两位小数
- 使用dynamic获取类型可变的json对象
- jsf中enetity类没有定义或者识别的报错
- js简单实现文件下载
- JS通过prototype实现继承的简单示例:
- JSON 教程