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

3928

被折叠的 条评论
为什么被折叠?



