并查集的题
从被修复的点里,选距离不超过k的,并;
查 两个点是否连通
#include<iostream>
#include<cstring>
using namespace std;
typedef long long ll;
const int N=1005;
int p[N],x[N],y[N];
bool can_use[N];
int find(int x){
if(p[x]!=x) return p[x]=find(p[x]);
return p[x];
}
int getdis(int a,int b){
return (x[a]-x[b])*(x[a]-x[b])+(y[a]-y[b])*(y[a]-y[b]);
}
int main(){
int n,d;
scanf("%d%d",&n,&d);
for(int i=1;i<=n;++i){
scanf("%d%d",&x[i],&y[i]);
}
for(int i=1;i<=n;++i) { p[i]=i; }//并查集初始化
char s[3];
while(scanf("%s",s)!=EOF){
if(s[0]=='O'){
int a;
scanf("%d",&a);
can_use[a]=true;//修复
for(int i=1;i<=n;++i){//每修复一个点 更新点集里所有点的关系
if(can_use[i]&&getdis(i,a)<=d*d&&i!=a){
p[find(i)]=p[find(a)];//p[] find() 找父亲和找祖宗 注意区别
//p[find(a)]=find(i);//这样写也行
}
}
}else{
int a,b;
scanf("%d%d",&a,&b);
int fa=find(a),fb=find(b);
if(fa==fb) puts("SUCCESS");
else puts("FAIL");
}
}
}