本题运用并查集来进行解决,刚刚学习并查集,在union处出错了,还要进行注意;
下面见ac代码
#include<cstdio>
#include<iostream>
#include<algorithm>
#include<cmath>
using namespace std;
const int maxn=3000+10;
int x[maxn],y[maxn],par[maxn];
int repair[maxn]={0};
int n,len;
double Dis(int a,int b)
{
return sqrt(double((x[a]-x[b])*(x[a]-x[b])+(y[a]-y[b])*(y[a]-y[b])));
}
void init()
{
len=0;
for(int i=0;i<=n;i++)
par[i]=i;
}
int find(int x)
{
return par[x]==x?par[x]:par[x]=find(par[x]);
}
void Union(int x,int y)
{
par[find(x)] = find(y);
}
int main()
{
char s[maxn];
int a,b,c;
//freopen("A.txt","r",stdin);
scanf("%d %d",&n,&c);
init();
for(int i=1;i<=n;i++)
{
scanf("%d %d",&x[i],&y[i]);
}
while(scanf("%s",&s)!=EOF)
{
if(s[0]=='O')
{
scanf("%d",&a);
//cout<<a<<endl;
repair[len++]=a;
for(int i=0;i<len-1;i++)
{
if(Dis(repair[i],a)<=(double)c&&repair[i]!=a)
Union(repair[i],a);
}
}
else if(s[0]=='S')
{
scanf("%d %d",&a,&b);
//cout<<a<<b<<endl;
if(find(a)==find(b))
printf("SUCCESS\n");
else
printf("FAIL\n");
}
}
return 0;
}