题目描述:
一场地震在东南亚发生了。不幸的是ACM组织通过计算机简历的无线网络遭到毁灭性的影响———网络中所有的计算机都损坏了。在经过维修之后,无线网络又逐渐开始运作了。由于硬件的制约,每两台计算机只能保持不超过d米的距离,才可以直接进行通信,但是每台计算机又可以作为其他两台计算机通信的中介点。也就是说,如果A计算机与B计算机不在能直接通信的范围内,但是它们可以同时通过与A和B计算机通信的C计算机建立间接的通信关系。
在维修的过程中,维修者可以进行两种操作:维修一台计算机或者检测两台计算机之间是否能够通信,你的任务就是解答每一次的检测操作。
输入:
第一行包含两个整数N和d(1<=N<=1001,0<=d<=20 000),N表示计算机的数量,计算机的编号从1开始到N,d为两台能直接通信的计算机所需保持的距离的最大值。在接下来的N行里。每行包含两个整数x和y(0<=x,y<=10 000),表示N台计算机的坐标,接下来的一系列的输入都比表示维修者的操作,每种操作都是以下两种操作中的一种:
①"O p"(1<=p<=N),表示维修第p台计算机。
②"S p q"(1<=p,q<=N),表示检测p与q计算机是否能够通信。
输出:
对于每组检测操作,若两台计算机能进行通信就输出"SUCCESS",否则输出"FAIL"
样例输入:
4 1
0 1
0 2
0 3
0 4
0 5
O 1
O 2
O 4
S 1 4
O 3
S 1 4
样例输出:
FAIL
SUCCESS
#include<stdio.h>
#include<string.h>
#include<stdlib.h>
#include<math.h>
int map[1005][1005];//标记可以直接通信的计算机
int f[1005];
int mul(int x)
{
return x * x;
}
int find(int x)
{
if(f[x] != x)
f[x] = find(f[x]);
return f[x];
}
void make(int a, int b)
{
int f1 = find(a);
int f2 = find(b);
if(f1 != f2)
f[f2] = f1;
}
void check(int a, int b)
{
int f1 = find(a);
int f2 = find(b);
if(f1 == f2)
{
printf("SUCCESS\n");
return ;
}
printf("FAIL\n");
}
int main()
{
int n, flag[1005];//flag标记计算机是否完好
double d;
memset(map, 0, sizeof(map));
memset(flag, 0, sizeof(flag));
scanf("%d%lf", &n, &d);
int x[1005], y[1005], i, j, k;
for(i = 1; i <= n; i ++)
scanf("%d%d", &x[i], &y[i]);
for(i = 1; i <= n; i ++)
f[i] = i;
for(i = 1; i < n; i ++)
for(j = i+1; j <= n; j ++)
if(sqrt((double)(mul(x[i]-x[j])+mul(y[i]-y[j]))) <= d)
{
map[i][j] = 1;
map[j][i] = 1;
}
char s[5];
int a, b;
while(scanf("%s", s) != EOF)
{
if(strcmp(s, "O") == 0)
{
scanf("%d", &a);
flag[a] = 1;
for(i = 1; i <= n; i ++)
if(map[i][a] && flag[i])
make(a, i);
}
else
{
scanf("%d%d", &a, &b);
check(a, b);
}
}
return 0;
}