题目链接: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;
}