首先看到了給坐標的,我突然間一下子就蒙圈了,難道說我要用勾股定理去算出一個雙精度距離?我的天前段時間被雙精度坑出翔了的事兒我還記得,這次用雙精度,我這不就是要找死嗎?不過還好,后來想到了直接一個布爾表達式判斷拉倒了……
首先,所有的電腦的坐標全都給記下來,然后開始了指令的執行,再執行指令的時候,把所有能連接上的電腦合并到一個集合里面,然后需要檢查兩臺電腦是否能夠連接的時候,直接檢查兩個電腦是不是在一個集合里面就行了。
但是千萬不要忘了,在剛開始的時候,所有的電腦全都是壞的,壞電腦是放不進去集合里面的(我會說因為這個標記上的錯誤樣例都沒過去嗎?
)

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