poj2236 Wireless Network

来源:互联网 发布:mac可以玩qq堂吗 编辑:程序博客网 时间:2024/05/21 07:50

题目链接:http://poj.org/problem?id=2236
题意:有n台电脑,当电脑相互之间的距离小于d,才能进行通讯,现在有两种操作,O x表示,打开第x台电脑的电源,S x y,表示询问x和y台电脑之间能否通讯
解析:并查集,因为只有打开电源才有通讯的道理,所以每次做O操作的时候,才做合并操作,然后每次询问,就相当于询问是否在同一个集合里

#include <iostream>#include <algorithm>#include <cstdio>using namespace std;const int maxn = 1e5+100;int x[maxn],y[maxn];int fa[maxn];int vis[maxn];int dis(int x1,int y1,int x2,int y2){    return (x1-x2)*(x1-x2)+(y1-y2)*(y1-y2);}int getfa(int x){    if(fa[x]==x)        return fa[x];    return fa[x] = getfa(fa[x]);}void merge(int u,int v){    int t1 = getfa(u);    int t2 = getfa(v);    if(t1!=t2)        fa[t1] = t2;}int main(void){    int n,d;    scanf("%d %d",&n,&d);    for(int i=1;i<=n;i++)    {        scanf("%d %d",&x[i],&y[i]);        fa[i] = i;    }    char op;    int t1,t2;    while(cin>>op>>t1)    {        if(op=='O')        {            vis[t1] = 1;            for(int i=1;i<=n;i++)            {                if(vis[i] && dis(x[i],y[i],x[t1],y[t1])<=d*d)                    merge(i,t1);            }        }        else        {            scanf("%d",&t2);            if(getfa(t1)!=getfa(t2))                puts("FAIL");            else                puts("SUCCESS");        }    }    return 0;}