并查集裸题
#include <iostream>
#include <set>
#include <math.h>
using namespace std;
struct node{
int x,y;
node(int x = 0, int y = 0):x(x),y(y){}
}A[1100];
int p[1100];
set <int> vis;
double dis(node a, node b){return sqrt(double((a.y-b.y)*(a.y-b.y) + (a.x-b.x)*(a.x-b.x)));}
int find(int x){return x==p[x]? x :find(p[x]);}
int main(){
int t,d,x,n,n1;
cin>>t>>d;
for(int i = 0; i < t ; i++){ cin>>A[i].x>>A[i].y; p[i] = i;}
char a;
while(cin>>a){
if(a=='O'){
cin>>x;
vis.insert(x-1);
for(set<int>::iterator it = vis.begin(); it!=vis.end();it++){
if(dis(A[x-1],A[*it])<=d){
int x1 = find(x-1);
int x2 = find(*it);
if(x1!=x2) {p[x1] = x2;}
}
}
}
if(a=='S'){
cin>>n>>n1;
int x1 = find(n-1);
int y1 = find(n1-1);
if(x1==y1) cout<<"SUCCESS\n";
else cout<<"FAIL\n";
}
}
return 0;
}