F. 无线网络 (Ver. I)

博客围绕无线网络问题展开,在东南亚地震后网络计算机损坏,修复过程中有修复和测试两种操作。需根据输入的计算机数量、坐标及操作指令,判断两台计算机是否可通信。解题采用广度优先搜索(BFS)对计算机信息图进行搜索。

F. 无线网络 (Ver. I)

题目描述

在东南亚发生了地震。 ACM(Asia Cooperated Medical team)已经用笔记本建立了无线网络,但是由于一次余震,网络中的所有计算机都损坏了。 计算机一个接一个地修复,网络逐渐开始工作。 由于硬件限制,每台计算机只能直接与距离它不远的计算机进行通信。 但是,每台计算机都可以被视为两台计算机之间通信的中介,也就是说,如果计算机A和计算机B可以直接通信,计算机C可以与计算机A进行通信,则计算机C和计算机B可以进行通信。

在修复网络的过程中,工作人员先后进行两种操作,先修复计算机,再测试两台计算机是否可以通信。 你的任务是回答所有的测试操作。

输入

输入数据只有一组

第一行包含两个整数N和d(1 <= N <= 100,0 <= d <= 20000)。 这里N是计算机的数量,编号从1到N,D是两台计算机可以直接通信的最大距离。 在接下来的N行中,每行包含两个整数xi,yi(0 <= xi,yi <= 10000),这是N台计算机的坐标。 从第(N + 1)行到输入结束,有一些操作,这些操作是一个接一个地执行的。 每行包含以下两种格式之一的操作:

1.“O p”(1 <= p <= N),修复计算机p
2.“S p q”(1 <= p,q <= N),测试计算机p和q是否可以通信

其中所有的修复操作都在测试操作之前

输入不会超过3000行

输出

对于每个测试操作,如果两台计算机可以通信则输出“SUCCESS”,否则输出“FAIL”。

整体思路

对由计算机信息组成的图进行广度优先搜索(BFS)或深度优先搜索(DFS)。题主用的是BFS,首先将初始的计算机压入队列,然后进行搜索。

解题代码

#include <iostream>
#include <queue>
using namespace std;
class Cord
{
public:
    int order;         //计算机的序号
    int x;             //坐标x
    int y;             //坐标y
    bool state;        //是否可用
    bool search_state; //是否被寻找过,用于后面的DFS
    Cord() {}
    void set_xy(int a, int b, int c)
    {
        x = a;
        y = b;
        order = c;
        state = false;
        search_state = false;
    }
};

int distance(Cord *a, int m, int n) //计算两点之间的距离
{
    return (a[m].x - a[n].x) * (a[m].x - a[n].x) + (a[m].y - a[n].y) * (a[m].y - a[n].y);
}

void Link(Cord *a, int con, int nect, int num, int max)
{
    if (a[con].state == false) //判断初始的计算机是否是坏的
    {
        cout << "FAIL" << endl;
        return;
    }

    queue<Cord> b;
    b.push(a[con]);
    a[con].search_state = true;
    while (!b.empty())
    {
        int m = b.front().order;
        b.pop();
        for (int i = 0; i < num; i++)
        {
            if (a[i].search_state == false && distance(a, m, i) <= max * max && a[i].state == true)
            {
                a[i].search_state = true;
                b.push(a[i]);
            }
        }
        if (a[nect].search_state == true)
        {
            cout << "SUCCESS" << endl;
            return;
        }
    }
    cout << "FAIL";
    cout << endl;
}

void repair_link()
{
    int puter_num; //电脑个数
    int max;       //max_ditance 即最大距离
    char type;     //判断是进行计算机修复还是进行计算机连接
    cin >> puter_num >> max;
    Cord *puter = new Cord[puter_num];
    for (int i = 0; i < puter_num; i++)
    {
        int a, b;
        cin >> a >> b;
        puter[i].set_xy(a, b, i);
    }

    while (cin >> type)
    {
        if (type == 'O')
        {
            int i;
            cin >> i;
            puter[i - 1].state = true;
        }
        else if (type == 'S')
        {
            int con_1, con_2;
            cin >> con_1 >> con_2;
            Link(puter, con_1 - 1, con_2 - 1, puter_num, max);
            for (int i = 0; i < puter_num; i++)
                puter[i].search_state = false;
        }
    }
}

int main()
{

    repair_link();
    return 0;
}
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值