#include <iostream>
#include<cstdio>
#include<algorithm>
#include<vector>
using namespace std;
pair<int,int> cor[1005];
int n,d,par[1005],rk[1005];
bool isconnect(int i1,int i2,int d)
{
return d*d>=(cor[i1].first-cor[i2].first)*(cor[i1].first-cor[i2].first)+(cor[i1].second-cor[i2].second)*(cor[i1].second-cor[i2].second);
}
void inital()
{
for(int i=0;i<=n;i++)
{
par[i]=i;rk[i]=0;
}
}
int f(int x)
{
if(par[x]==x)
return x;
else
return par[x]=f(par[x]);
}
void unite(int n1,int n2)
{
n1=f(n1);
n2=f(n2);
if(n1==n2)
return ;
if(rk[n1]<rk[n2])
{
par[n1]=n2;
}
else
{
par[n2]=n1;
if(rk[n1]==rk[n2])
rk[n1]++;
}
}
bool same(int n1,int n2)
{
n1=f(n1);
n2=f(n2);
return n1==n2;
}
int main()
{
scanf("%d%d",&n,&d);
for(int i=1;i<=n;i++)
scanf("%d%d",&cor[i].first,&cor[i].second);
char ch;
int num,cnt=0;
vector <int> wire;
inital();
while(cin>>ch)
{
if(ch=='O')
{
scanf("%d",&num);
vector<int>::iterator it = find( wire.begin( ), wire.end(), num );
if(it!=wire.end())
{
continue;
}
for(int i=0;i<wire.size();i++)
{
if(isconnect(num,wire[i],d))
{
unite(num,wire[i]);
}
}
wire.push_back(num);
cnt++;
}
else if(ch=='S')
{
int n1,n2;
scanf("%d%d",&n1,&n2);
if(same(n1,n2))
printf("SUCCESS\n");
else printf("FAIL\n");
}
}
return 0;
}
W了一次,原来是把距离判断公式写错了,我也是无语了
此题用的是并查集,但是数据似乎比较小,不需要写这么详细