题意:
图上有n个坏掉的电脑;
如果两台电脑都是好的,并且距离小于d则可以通信,当然不需要直接通信也可以,可以通过中间一台好的电脑通信;
O a表示修好了电脑a
S a b问a,b能不能通信;
思路:
每次修好一台电脑,都和所有其他已经修好的电脑比较距离,如果小于d,和那台电脑并起来;
#include<cstdio>
#include<cstring>
#include<cmath>
#include<algorithm>
using namespace std;
const int N = 1005;
int p[N],x[N],y[N],repair[N],n,cnt;
double d;
char c;
void init(int a) {
for(int i = 0; i <= a; i++)
p[i] = i;
}
double cul(int a,int b) {
return sqrt(1.0*(x[a]-x[b]) * (x[a]-x[b]) + 1.0*(y[a]-y[b])*(y[a] - y[b]));
}
int find_p(int a) {
return a == p[a] ? a : p[a] = find_p(p[a]);
}
void Union(int a,int b) {
int px = find_p(a);
int py = find_p(b);
if(px != py)
p[px] = py;
}
int main() {
scanf("%d%lf",&n,&d);
for(int i = 0; i < n; i++) {
scanf("%d%d",&x[i],&y[i]);
}
init(n);
int a,b;
cnt = 0;
getchar();
while(scanf("%c%d",&c,&a) != EOF) {
if(c == 'O') {
for(int i = 0; i < cnt; i++) {
if(cul(a - 1,repair[i]) <= d)
Union(a - 1,repair[i]);
}
repair[cnt++] = a - 1;
}
if(c == 'S') {
scanf("%d",&b);
if(find_p(a - 1) == find_p(b - 1))
printf("SUCCESS\n");
else
printf("FAIL\n");
}
}
}