poj-2236-Wireless Network

并查集简单题 题意表面是1000*20000的数量级 其实最坏只需要(1+1000)*1000/2次合并就行了。。。

#include<cstdio>
int n,d;
char order[10];
struct node{
    int x,y;
}a[2000];
int fa[2000],am[2000],st[2000];
void init() 
{
    for(int i=1;i<=n;i++)
      {
        fa[i] = -1;
        am[i] = 0;
      }
}
int toGetFarther(int i)
{
    while(!(fa[i]==i||fa[i]==-1))
     i = fa[i];
     return i;
}
void unon(int x,int y)
{
    int fax = toGetFarther(x),fay = toGetFarther(y);
    if(fax!=fay)
    {
        if(am[fax]>am[fay])
        {
            fa[fay] = fax;
            am[fax]+=am[fay];
        }
        else
        {
            fa[fax] = fay;
            am[fay] += am[fax];
        }
    }
}
int main()
{
    scanf("%d%d",&n,&d);
    int l1 = 0;
    init();
    for(int i=1;i<=n;i++)
      scanf("%d%d",&a[i].x,&a[i].y);
    while(scanf("%s",order)!=EOF)
    {
        if(order[0]=='O')
        {
            int to;
            scanf("%d",&to);
            if(fa[to]!=-1)continue;//如果已经修过就没必要再修了。。。
            else{
                fa[to] = to;
                am[to] = 1;
                for(int i=0;i<l1;i++)
                 if((a[st[i]].x-a[to].x)*(a[st[i]].x-a[to].x)+(a[st[i]].y-a[to].y)*(a[st[i]].y-a[to].y)<=d*d)
                     unon(st[i],to);
                 st[l1] = to;
                 l1++;
            }
        }
        else
        {
            int st,en;
            scanf("%d%d",&st,&en);
            int stf = toGetFarther(st);
            int enf = toGetFarther(en);
            if(stf==enf&&stf!=-1)printf("SUCCESS\n");
            else printf("FAIL\n");
        }
    }
    return 0;
}
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值