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;
}

posted @ 2010-08-25 19:26  菜到不得鸟  阅读(168)  评论(0)    收藏  举报