pku 2236 Wireless Network
#include <stdio.h>
#include <string.h>
#include <math.h>
#define MAXN 1005
#define MAXQ 300005
struct coor
{
int x,y;
};
coor pos[MAXN];
int father[MAXN],repaired[MAXQ];
inline double dis(int x1,int y1,int x2,int y2)
{
return sqrt(double(x1-x2)*(x1-x2) + (y1-y2)*(y1-y2));
}
inline int find(int x)
{
int i,t;
for(i=x; father[i]>0; i=father[i]) ;
while(x!=i)
{
t=father[x];
father[x]=i;
x=t;
}
return i;
}
inline void merge(int fx,int fy)
{
if(father[fx]>father[fy])
{
father[fy]+=father[fx];
father[fx]=fy;
}
else
{
father[fx]+=father[fy];
father[fy]=fx;
}
}
int main()
{
memset(father,-1,sizeof(father));
int N,maxd,i,j,fi,fj,num=0;
char ch[2];
scanf("%d %d",&N,&maxd);
for(i=1; i<=N; i++) scanf("%d %d",&pos[i].x,&pos[i].y);
while(scanf("%s",ch)!=EOF)
{
if(ch[0]=='O')
{
scanf("%d",&i);
repaired[num++]=i;
for(j=0; j<num-1; j++)
{
fi=find(i);
fj=find(repaired[j]);
if(fi != fj)
{
if(dis(pos[i].x,pos[i].y,pos[repaired[j]].x,pos[repaired[j]].y) <= maxd)
merge(fi,fj);
}
}
}
else
{
scanf("%d %d",&i,&j);
if( find(i) == find(j) ) printf("SUCCESS\n");
else printf("FAIL\n");
}
}
return 0;
}
浙公网安备 33010602011771号