POJ2236:
题目大意:
有很多台电脑,两台电脑距离在D之内才能通信,或者通过第三台电脑进行通信。判断两台电脑能否通信。
0表示修复,S表示测试。
题解:这是简单的并查集,S的时候只要判断两台电脑是不是在一个集合中就行,0将两个点合并的时候注意要判断距离是不是小于D。
#include <iostream>
#include<math.h>
#include<stdio.h>
using namespace std;
#define maxn 1008
struct node
{
int x,y;
int par;
};
int N,d;
node P[maxn];
bool used[maxn];
void Init(int num)
{
for(int i=1;i<=num;i++)
{
P[i].par=i;
}
}
int finds(int X)
{
if (X==P[X].par)
return X;
else
return finds(P[X].par);
}
void unions(node p1,node p2)
{
int root1,root2;
root1=finds(p1.par);
root2=finds(p2.par);
if(root1!=root2&&(pow(p1.x-p2.x,2)+pow(p1.y-p2.y,2)<=d*d))
P[root2].par=root1;
}
int main()
{
cin>>N>>d;
for(int i=1;i<=N;i++)
{
cin>>P[i].x>>P[i].y;
}
Init(N);
char m[4];
int x,y;
while(cin>>m)
{
if(m[0]=='O')
{
cin>>x;
used[x]=true;
for(int i=1;i<=N;i++)
{
if(used[i]&&i!=x)
unions(P[i],P[x]);
}
}
else
{
cin>>x>>y;
if(finds(x)==finds(y))
cout<<"SUCCESS\n";
else
cout<<"FAIL\n";
}
}
return 0;
}