挺简单的并查集模板题,没有什么要改的地方,只是多加了一个可以链接的必要条件而已,两个计算机之间的距离大于d的话他们两个之间就不能直接链接起来,输入字符的时候注意一下前面的回车就行
#include<iostream>
#include<algorithm>
#include<cstring>
#include<cstdio>
using namespace std;
const int MAXN=1050;
int vis[MAXN];
int cnt=0;
double d;
int n;
struct node{
int pre;
int x;
int y;
}p[MAXN];
void init()
{
for(int i=1;i<=n;i++)
p[i].pre=i;
}
bool check(node a,node b)
{
if((a.x-b.x)*(a.x-b.x)+(a.y-b.y)*(a.y-b.y)<=d*d)
return true;
else
return false;
}
int find(int x)
{
if(x==p[x].pre)
return x;
else
return find(p[x].pre);
}
void unite(node x,node y)
{
int a=find(x.pre);
int b=find(y.pre);
if(a!=b)
if(check(x,y))
p[a].pre=b;
}
int main()
{
cin>>n>>d;
init();
for(int i=1;i<=n;i++)
cin>>p[i].x>>p[i].y;
memset(vis,0,sizeof(vis));
char c;
while(scanf("\n%c",&c)!=EOF)
{
int a,b;
if(c=='O')
{
scanf("%d",&a);
vis[a]=1;
for(int i=1;i<=n;i++)
if(vis[i]&&i!=a)
unite(p[a],p[i]);
}
else
{
scanf("%d%d",&a,&b);
if(find(a)==find(b))
printf("SUCCESS\n");
else
printf("FAIL\n");
}
}
return 0;
}