题意:
规定若干个坐标,xi ,yi
查询是否从一个点到另一个点可以连通(即距离小于d)
思路:
依次查找两点间距离,如果可以就合并到同一个集合中
#include <iostream>
#include <stdio.h>
using namespace std;
int father[1005];
int xi[1005];
int yi[1005];
int d,n;
int find(int x)
{
if(father[x]!=x)
father[x]=find(father[x]);
return father[x];
}
void Union(int x)
{
for(int i=1;i<=n;i++)
{ int root1=find(x);//一定要合在里面,否则 O 4 O 3会出错。父节点没更新
if(father[i]!=0&&i!=x)
{
int tep=(xi[x]-xi[i])*(xi[x]-xi[i])+(yi[x]-yi[i])*(yi[x]-yi[i]);
if(tep<=d*d)
{
int root2=find(i);
father[root1]=root2;
}
}
}
}
int main()
{
cin>>n>>d;
for(int i=1;i<=n;i++)
father[i]=0;
for(int i=1;i<=n;i++)
{
cin>>xi[i]>>yi[i];
}
char s[5];
while(~scanf("%s",s))
{
int x,y;
if(s[0]=='O')
{
scanf("%d",&x);
father[x]=x;
Union(x);
find(x);
}
else
{
scanf("%d%d",&x,&y);
find(x);
find(y);
if(father[x]==father[y])
printf("SUCCESS\n");
else
printf("FAIL\n");
}
}
return 0;
}