Problem I: 我没碰它自己就坏了

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) 行到输入结束,是逐一执行的操作,每行包含一个操作,格式是以下两者之一:

  1. “O p” (1 <= p <= N),表示维护电脑 p 。
  2. “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;
}```

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 3
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论 3
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值