Description
电脑坏了,机房的电脑坏了,机房的电脑全坏了。。。。不是我干的!!
机房的电脑因为未知的原因现在全都连不上网了。。。幸好维修是免费的
四叶草的人已经来到了现场进行电脑的修理作业,但是由于机房的电脑质量不是很好,修好后的电脑只能与距离它不超过 d 米的其它被修好的电脑进行直接通信。不过因为每台电脑可被看作其它两台电脑的通信中转点,也就是说,假如电脑 A 和电脑 B 可以直接通信,或存在一台电脑 C 既可与 A 也可与 B 通信,那么电脑 A 和电脑 B 之间就能够实现通信。
不过四叶草人手不足,所以请求你的帮助
Input
第一行包含了两个整数 N 和 d (1 <= N <= 1001, 0 <= d <= 20000), N表示电脑的数目,编号从 1 到 N;D表示两台电脑之间能够直接通信的最大距离。
接下来的 N 行,每行包含两个整数 xi, yi (0 <= xi, yi <= 10000),分别表示第 i 台电脑的横纵坐标。
从第 (N+1) 行到输入结束,是逐一执行的操作,每行包含一个操作,格式是以下两者之一:
- “O p” (1 <= p <= N),表示维护电脑 p 。
- “S p q” (1 <= p, q <= N),表示测试电脑 p 和 q 是否能够通信。
Output
对于每个"S p q"操作的询问,如果两台电脑能够通信,则打印 “SUCCESS”;否则,打印 “FAIL”。
Sample Input Copy
4 1
0 1
0 2
0 3
0 4
O 1
O 2
O 4
S 1 4
O 3
S 1 4
Sample Output Copy
FAIL
SUCCESS
代码实现:
#include<bits/stdc++.h>
using namespace std;
#define ios ios::sync_with_stdio(false); cin.tie(NULL);
const int N = 1010;
struct coco
{
int x;
int y;
double z;
} s[1010]; //存坐标
int n,d;
int vis[1010];//表示修好的
int pre[N];
int find_pre(int a)
{
if(pre[a]!=a)
pre[a]=find_pre(pre[a]);
else
return pre[a];
return pre[a];
}
bool judge(int fa,int fb)
{
for(int i=1; i<=n; i++)
{
if(pre[i]==fb&&fabs(s[i].z-s[fa].z)<=d)
{
return true;
}
}
return false;
}
int main()
{
cin>>n>>d;
for(int i=1; i<=n; i++)
{
pre[i] = i;
}
for(int i=1; i<=n; i++)
{
cin>>s[i].x>>s[i].y;
s[i].z = sqrt(s[i].x*s[i].x+s[i].y*s[i].y);//到零点的距离
}
char str;
int k;
int a,b;
while(cin>>str)
{
if(str == 'O')
{
cin>>k;
vis[k] = 1;
for(int i=1; i<=n; i++)
{
if(vis[i]==1&&fabs(s[i].z-s[k].z)<=d)
{
pre[i]=k;
}
}
}
else if(str == 'S')
{
cin>>a>>b;
if(vis[a]==1 && vis[b]==1)
{
int fa = find_pre(a);
int fb = find_pre(b);
if(fa == fb)
{
cout<<"SUCCESS"<<endl;
}
else if(judge(fa,fb))
{
pre[fa] = fb;
cout<<"SUCCESS"<<endl;
}
else
cout<<"FAIL"<<endl;
}
else
cout<<"FAIL"<<endl;
}
}
return 0;
}```