首先看到了给坐标的,我突然间一下子就蒙圈了,难道说我要用勾股定理去算出一个双精度距离?我的天前段时间被双精度坑出翔了的事儿我还记得,这次用双精度,我这不就是要找死吗?不过还好,后来想到了直接一个布尔表达式判断拉倒了……
首先,所有的电脑的坐标全都给记下来,然后开始了指令的执行,再执行指令的时候,把所有能连接上的电脑合并到一个集合里面,然后需要检查两台电脑是否能够连接的时候,直接检查两个电脑是不是在一个集合里面就行了。
但是千万不要忘了,在刚开始的时候,所有的电脑全都是坏的,坏电脑是放不进去集合里面的(我会说因为这个标记上的错误样例都没过去吗?)
view code
1 #include <iostream>
2 #include <cstdio>
3 #include <cstdlib>
4 #include <cstring>
5 #include <cmath>
6 #include <algorithm>
7 using namespace std;
8 #define N 1010
9 struct data
10 {
11 int x, y;
12 }k[N];
13 int p[N], d;
14 bool dis(int a, int b)
15 {
16 int x = k[a].x - k[b].x;
17 int y = k[a].y - k[b].y;
18 if (x * x + y * y <= d * d) return 1;
19 else return 0;
20 }
21 int find(int x)
22 {
23 return p[x] != x ? p[x] = find(p[x]) : x;
24 }
25 int main()
26 {
27 int n;
28 int x, y;
29 int r1, r2;
30 char c;
31 bool f[N];
32 cin >> n >> d;
33 for (int i = 1; i <= n; i++)
34 {
35 p[i] = i;
36 scanf("%d%d", &k[i].x, &k[i].y);
37 f[i] = 0;
38 }
39 while (scanf("\n%c", &c) != EOF)
40 {
41 if (c == 'O')
42 {
43 scanf("%d", &x);
44 f[x] = 1;
45 for (y = 1; y <= n; y++)
46 {
47 if (y != x && dis(x, y) && f[y])
48 {
49 r1 = find(x); r2 = find(y);
50 if (r1 != r2)
51 p[r2] = r1;
52 }
53 }
54 }
55 if (c == 'S')
56 {
57 scanf("%d%d", &x, &y);
58 r1 = find(x); r2 = find(y);
59 if (r1 == r2) printf("SUCCESS\n");
60 else printf("FAIL\n");
61 }
62 }
63 return 0;
64