題目鏈接: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;
}