参考(43条消息) SCAU 18233 万湖之国的形成_小白蹦蹦跳跳的博客-CSDN博客
Description
N国原是一块平原上,没有湖,直到一颗小行星撞入大气层碎成成千上万的碎片,碎片再撞击地面形成 一个一个的坑, 下雨之后,最终形成万湖之国。 现在科学家想用计算机模拟万湖之国形成过程,假设每一块碎片撞击地面,都撞出一个园形坑,现在知道 每一个碎片造成的坑的圆心和半径,问每个坑都注满水后,最终形成多少个湖?
输入格式
第一行一个整数N,1<=N<=100,000,表示坑的数量 此后N行,每一行三个double实数,前两个数是圆心的坐标x和y,最后一个数是圆半径(不大于1000) (数据随机产生,分布均匀)
输出格式
湖的个数
输入样例
3 0 0 5 10 0 5 11.1 0 2.5
输出样例
2
#include<iostream>
#include<algorithm>
using namespace std;
int pre[100005];
struct Circle{
double x,y,r;
}circle[100005];
bool cmp(Circle a,Circle b){
return a.x+a.r<b.x+b.r;
}
int Find(int x){
if(pre[x]==x){
return x;
}else{
return pre[x]=Find(pre[x]);
}
}
int main(){
int n;
cin>>n;
int num=n;
for(int i=0;i<n;++i){
cin>>circle[i].x>>circle[i].y>>circle[i].r;
pre[i]=i;
}
sort(circle,circle+n,cmp);
for(int i=0;i<n;++i){
for(int j=i-1;j>=0;--j){
if(circle[j].x+circle[j].r<=circle[i].x-circle[i].r){
break;
}else if((circle[i].x-circle[j].x)*(circle[i].x-circle[j].x)+(circle[i].y-circle[j].y)*(circle[i].y-circle[j].y)<(circle[i].r+circle[j].r)*(circle[i].r+circle[j].r)){
int a,b;
a=Find(i);
b=Find(j);
if(a!=b){
num--;
pre[a]=b;
}
}
}
}
cout<<num;
return 0;
}