并查集判断两个点是否联通,只需看他们的根节点是不是相同。
/*Accepted 224K 2688MS C++ 1339B 2012-08-23 16:32:01*/ #include<stdio.h> #include<string.h> #include<stdlib.h> #include<math.h> const double eps = 1e-8; const int MAXN = 1 << 10; int n, in[MAXN], p[MAXN], m; double d; struct point { double x, y; }t[MAXN]; double dist(point a, point b) { return sqrt((a.x - b.x) * (a.x - b.x) + (a.y - b.y) * (a.y - b.y)); } int find_set(int x) { return p[x] == x ? x : (find_set(p[x])); } void union_set(int a, int b) { int na, nb; na = find_set(a), nb = find_set(b); if(na != nb) { p[na] = nb; } } void Prepare() { int i; for(i = 1; i <= n; i ++) scanf("%lf%lf", &t[i].x, &t[i].y); m = 0; for(i = 1; i < MAXN; i ++) p[i] = i; } int main() { char op[5]; int a, b, i; scanf("%d%lf", &n, &d); Prepare(); while(scanf("%s", op) != EOF) { if('O' == op[0]) { scanf("%d", &a); for(i = 0; i < m; i ++) { if(dist(t[in[i]], t[a]) < eps + d) union_set(in[i], a); } in[m ++] = a; } else { scanf("%d%d", &a, &b); if(find_set(a) == find_set(b)) printf("SUCCESS\n"); else printf("FAIL\n"); } } return 0; }