场地震在东南亚发生 了.不幸的是ACM组织通过计算机建立的无线网络遭到了毁灭性的影响一网络中所有计算 机都损坏了在陆续维修计算机之后,无线网络有逐渐开始再一次运作了, 由于硬件的制约,每两台计算机只能保持不超过d m的距离,才可以直接进行通信但是每台计算机又可以作为其他两台计算机通信的中介点也就是说,假设A计算机与B计算机不在能直接通信的范围内,但是它们可以同时能与A和B计算机通信的C计算机建立间接通信关系
在维修过程中.维修者可以进行两种操作:维修一台计算机或者检测两台计算机之间是否能够通信你的任务就是解答每一次的检测操作.
输入
第一行包含两个整数N和d (1≤N≤1 001 ,0≤d≤20 000).其中N表示计算机的数量,计算机编号从1开始到N;d为两台能直接通信的计算机所需保持的距离的最大值在接下F来的N行里,每行包含两个整数,y:(0≤xy≤10 00),表示N台计算机的坐标接下来的一系列输人都表示维修者的操作,每种操作都是以下两种中的种:
(1)“0p”(1≤p≤N),表示维修第p台计算机:
(2)“Spq"(1≤p,g≤N),表示检测p与q计算机是否能够通信输人不会超过300 000行输出
对于每组检测操作,若两台计算机能进行通信就输SCCESS,否则输出“FAILT “。
样例输入
4 1
0 1
0 2
0 3
0 4
0 1
O 2
0 4
S 1 4
0 3
S 1 4
样例输出
FAIL
SUCCESS
#include<iostream>
#include<string.h>
#include<math.h>
using namespace std;
#define max 10005
int x[max],y[max];
int f[max];
int flag[max];
int map[max][max];
int init()
{
for(int i=0;i<=max;i++)
{
f[i]=i;
}
}
int find(int x)
{
if(x=f[x])
{
return x;
}
else
{
return find(f[x]);
}
}
void hebing(int x,int y)
{
int xx=find(x);
int yy=find(y);
if(xx!=yy)
{
f[yy]=xx;
}
}
int chengji(int x)
{
return x*x;
}
int main()
{
int n;
int d;
cin>>n>>d;
init();
memset(flag,0,sizeof(flag));
for(int i=1;i<=n;i++)
{
cin>>x[i]>>y[i];
}
for(int i=1;i<=n;i++)
{
for(int j=i+1;j<=n;j++)
{
if(sqrt(chengji(x[i]-x[j])+chengji(y[i]-y[j]))<=d)
{
map[i][j]=1;
map[j][i]=1;
}
}
}
char s;
while(cin>>s)
{
if(s=='o')
{
int a,b;
cin>>a;
flag[a]=1;
for(int i=1;i<=n;i++)
{
if(flag[i]==1&&map[i][a]==1)
{
hebing(i,a);
}
}
}
else
{
for(int i=1;i<=n;i++)
{
cout<<find(i)<<endl;
}
int a,b;
cin>>a>>b;
if(find(a)==find(b))
{
cout<<"SUCCESS"<<endl;
}
else
{
cout<<"FAIL"<<endl;
}
}
}
return 0;
}