并查集的应用。
#include<cstdio>
#include<iostream>
using namespace std;
struct type{
int x,y;//电脑的坐标
bool state;//电脑是否已修复,已修复为1,未修复为0
}c[1005];
int par[1005],rank[1005],n,d;
void init(int n)
{
for(int i=1;i<=n;i++){
par[i]=i,rank[i]=0;
c[i].state=0;
}
}
int find(int x)
{
if(par[x] == x) return x;
else return( par[x] = find(par[x]) );
}
void unite(int x,int y)
{
x=find(x),y=find(y);
if(x == y) return;
if(rank[x] < rank[y]) par[x]=y;
else
{
par[y]=x;
if(rank[x] == rank[y]) rank[x]++;
}
}
double dist2(type a,type b)//返回两台电脑的距离的平方
{
return( (a.x-b.x)*(a.x-b.x) + (a.y-b.y)*(a.y-b.y) );
}
bool same(int x,int y){return( find(x) == find(y) );}
int main()
{
char op;
scanf("%d%d",&n,&d);
init(n);//初始化n台电脑
for(int i=1;i<=n;i++) scanf("%d%d",&c[i].x,&c[i].y);
while(cin>>op)
{
if(op == 'O')
{
int Num;
scanf("%d",&Num);
c[Num].state=1;
for(int i=1;i<=n;i++)//遍历每台电脑,对于某台电脑c[i]……
{
if(i == Num) continue;
if(c[i].state && dist2(c[i],c[Num]) <= d*d) unite(i,Num);//如果c[i]是已修复的,并且与当前修复这台电脑c[Num]距离小于d,就归入一组
}
}
else if(op == 'S')
{
int test1,test2;
scanf("%d%d",&test1,&test2);
if(same(test1,test2)) printf("SUCCESS\n");//在同一组内,就可以成功通信
else printf("FAIL\n");//否则就无法通信
}
}
}