首先看到了给坐标的,我突然间一下子就蒙圈了,难道说我要用勾股定理去算出一个双精度距离?我的天前段时间被双精度坑出翔了的事儿我还记得,这次用双精度,我这不就是要找死吗?不过还好,后来想到了直接一个布尔表达式判断拉倒了……
首先,所有的电脑的坐标全都给记下来,然后开始了指令的执行,再执行指令的时候,把所有能连接上的电脑合并到一个集合里面,然后需要检查两台电脑是否能够连接的时候,直接检查两个电脑是不是在一个集合里面就行了。
但是千万不要忘了,在刚开始的时候,所有的电脑全都是坏的,坏电脑是放不进去集合里面的(我会说因为这个标记上的错误样例都没过去吗?)
#include <iostream>
#include <cstdio>
#include <cstdlib>
#include <cstring>
#include <cmath>
#include <algorithm>
using namespace std;
#define N 1010
struct data
{
int x, y;
}k[N];
int p[N], d;
bool dis(int a, int b)
{
int x = k[a].x - k[b].x;
int y = k[a].y - k[b].y;
if (x * x + y * y <= d * d) return 1;
else return 0;
}
int find(int x)
{
return p[x] != x ? p[x] = find(p[x]) : x;
}
int main()
{
int n;
int x, y;
int r1, r2;
char c;
bool f[N];
cin >> n >> d;
for (int i = 1; i <= n; i++)
{
p[i] = i;
scanf("%d%d", &k[i].x, &k[i].y);
f[i] = 0;
}
while (scanf("\n%c", &c) != EOF)
{
if (c == 'O')
{
scanf("%d", &x);
f[x] = 1;
for (y = 1; y <= n; y++)
{
if (y != x && dis(x, y) && f[y])
{
r1 = find(x); r2 = find(y);
if (r1 != r2)
p[r2] = r1;
}
}
}
if (c == 'S')
{
scanf("%d%d", &x, &y);
r1 = find(x); r2 = find(y);
if (r1 == r2) printf("SUCCESS\n");
else printf("FAIL\n");
}
}
return 0;
}