AC情况:
大致思路:这题看到就往并查集上靠了,就是判断距离那块感觉有点费时间,不过AC了,之前WA一次,查了半天发现是FAIL输成了FALL,,难受。。。
#include<iostream>
using namespace std;
int x[1001];
int y[1001];
int r[1001] = {0};
int par[1001];
int ran[1001];
void init(int n) {
for (int i = 0; i < n; i++) {
par[i] = i;
ran[i] = 0;
}
}
int find(int x) {
int j, r;
r = x;
while (par[r] != r)r = par[r];
while (par[x] != r) {
j = par[x];
par[x] = r;
x = j;
}
return r;
}
void unite(int x, int y) {
x=find(x);
y = find(y);
if (x != y) {
ran[x] < ran[y] ? par[x] = y : par[y] = x;
if (ran[x] == ran[y])ran[y]++;
}
}
int main() {
int N, D,i,op1,op2;
char c;
cin >> N >> D;
init(N);
for (i = 0; i < N; i++)
cin >> x[i] >> y[i];
while (cin >> c) {
if (c == 'O') {
cin >> op1;
op1--;
r[op1] = 1;
for (i = 0; i < N; i++)
if (r[i]&&find(op1)!=find(i))
if (D*D >= (x[i] - x[op1])*(x[i] - x[op1]) + (y[i] - y[op1])*(y[i] - y[op1])) {
unite(op1, i);
}
}if (c == 'S') {
cin >> op1 >> op2;
op1--;
op2--;
if (find(op1) == find(op2)) cout << "SUCCESS"<<endl;
else cout << "FAIL"<<endl;
}
}
return 0;
}