题目链接:POJ 2236 Wireless Network
#include<iostream>
#include<cstdio>
#include<cmath>
#include<algorithm>
#include<string>
#include<cstring>
using namespace std;
typedef long long ll;
const int maxn = 1010;
const int INF = 0x3f3f3f3f;
int father[maxn];
int repaired[maxn]; //存储修好的电脑的编号
struct point{
int x;
int y;
}p[maxn];
int n,d;
void init() //初始化
{
for(int i=1;i<=n;i++)
father[i] = i;
}
double dis(int x1,int y1,int x2,int y2) //求两点之间的距离
{
double d = sqrt((double)(x2-x1)*(x2-x1) + (double)(y2-y1)*(y2-y1));
return d;
}
int find(int x)
{
if(x!=father[x])
father[x] = find(father[x]);
return father[x];
}
void Union(int x, int y)
{
x = find(x);
y = find(y);
if(x!=y)
father[y] = x;
}
bool judge(int x,int y) //判断是否属于同一集合
{
x = find(x);
y = find(y);
if(x==y)
return true;
else
return false;
}
int main()
{
scanf("%d%d",&n,&d);
for(int i=1;i<=n;i++)
scanf("%d%d",&p[i].x,&p[i].y);
init();
char op;
int num;
int num1,num2;
int cnt = 0;
while(cin>>op)
{
if(op=='O')
{
scanf("%d",&num);
repaired[++cnt] = num; ////存储修好的电脑的编号
for(int i=1;i<=cnt;i++) //每次都要从头查询 已修好的所有电脑
{
if(dis(p[repaired[i]].x, p[repaired[i]].y, p[num].x, p[num].y) <= double(d))
Union(repaired[i], num);
}
}
else
{
scanf("%d%d",&num1,&num2);
if(judge(num1,num2))
printf("SUCCESS\n");
else
printf("FAIL\n");
}
}
return 0;
}