这道题就是不断修复电脑,然后根据输入的命令不断进行更新,每次遍历已经修好的电脑,如果发现距离小于限定的距离,就加入到并查集中。
#include <cstdio>
#include <cmath>
#include <iostream>
#include <algorithm>
using namespace std;
int N,d,tol;
const int computer_num = 1e3+5;
struct node
{
int x,y;
}coordinate[computer_num];
int father[computer_num],height[computer_num],repaired[computer_num];
bool tag[computer_num];
void initialize()
{
tol = 0;
for (int i=0;i<=N;i++)
{
father[i] = i;
height[i] = 0;
tag[i] = false;
}
}
int find(int son)
{
if (father[son]==son)
return son;
return father[son] = find(father[son]);
}
void Union(int x,int y)
{
x = find(x), y = find(y);
if (height[x] == height[y])
{
height[y] = height[y] + 1;
father[x] = y;
}
else
{
if (height[x] < height[y])
father[x] = y;
else
father[y] = x;
}
}
int main()
{
while (~scanf("%d %d",&N,&d))
{
initialize();
for (int i=1;i<=N;i++)
scanf("%d %d",&coordinate[i].x,&coordinate[i].y);
getchar();
char command;
while (~scanf("%c",&command))
{
if ('O'==command)
{
int indice;
scanf("%d",&indice);
if (tag[indice])
continue;
tag[indice] = true;
repaired[tol++] = indice;
for (int i=0;i<tol;i++)
{
double distance = sqrt(pow(coordinate[indice].x-coordinate[repaired[i]].x,2) +
pow(coordinate[indice].y-coordinate[repaired[i]].y,2));
if (distance <= d)
Union(repaired[i],indice);
}
}
else
{
int com1,com2;
scanf("%d %d",&com1,&com2);
if (find(com1) == find(com2))
printf("SUCCESS\n");
else
printf("FAIL\n");
}
getchar();
}
}
return 0;
}