2018.01.27【GDOI2018】模拟C组——无线网络

本文介绍了一个计算机网络模拟问题,涉及N台计算机通过无线信号互相通讯。文章详细解释了如何使用并查集数据结构来判断任意两台计算机是否可以通过直接或间接的方式进行通讯,尤其是在修复过程中。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

Description

有一个由n台计算机组成的无线网络。(n <= 1001),正常情况下,每台计算机都能跟与它距离不超过d的任何计算机通讯(d <= 20000)。地震发生了。所有的计算机都陷入瘫痪。专家们试着一台一台地修复计算机,以恢复整个无线网络。有时在修复的过程中,他们需要测试一下某两台计算机能否通讯(如果他们能通过别的正常的计算机进行通讯,也算他们之间可以通讯,即“能否通讯”可以是间接的)。
你的任务,就是模拟修复网络的过程,并回答“能否通讯”的询问。

Input

第一行两个整数,N和d,N表示计算机的数目,d表示两台计算机直接可直接通讯的最大距离。接下来的N行,每行两个整数Xi,Yi,表示每台计算机的坐标。接下来有许多行,每行都是一个操作(或者是修复操作,或者是询问操作)。
操作的格式如下:
O p (1 <= p <= N) 修复操作,表示修复编号为p的电脑;
S p q (1 <= p, q <= N) 询问操作,询问编号为p和编号为q的电脑能否通讯。
如果一台电脑尚未被修复,则它不能和任何电脑通讯。

Output

对于每个询问操作:如果能够通讯,输出一行SUCCESS;如果无法通讯,输出一行FAIL

Sample Input

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

FAIL
SUCCESS

Hint

【限制】
对于50%的数据,N <= 300, 操作次数 <= 10000;
对于100%的数据,N <= 1001, 操作次数 <= 300000。


思路

要运用到并查集。。。
首先用勾股定理判断它是否可以连接,然后再用并查集。。。


程序

var
  n,d:longint;
  x,y:array[0..1002]of longint;
  bz:array[0..1002]of boolean;
  father:array[0..1002]of longint;
function getfather(x:longint):longint;inline;
begin
  if father[x]=0 then exit(x);
  getfather:=getfather(father[x]);
  father[x]:=getfather;
end;
procedure init;
var
  i,j:longint;
begin
  readln(n,d);
  for i:=1 to n do
    readln(x[i],y[i]);
end;
procedure main;
var
  i,k,g,l,r:longint;
  c:char;
begin
  while not(eof) do
  begin
    read(c);
    if c='S' then
    begin
      readln(k,g);
      if k=g then
      begin
        if bz[k] then writeln('SUCCESS') else writeln('FAIL')
      end
        else
        begin
          l:=getfather(k);
          r:=getfather(g);
          if l<>r then writeln('FAIL')
            else writeln('SUCCESS');
        end;
    end
    else
      begin
        readln(k);
        bz[k]:=true;
        for i:=1 to n do
          if (sqrt(sqr(x[i]-x[k])+sqr(y[i]-y[k]))<=d)and(i<>k)and(bz[i]) then
          begin
            l:=getfather(k);
            r:=getfather(i);
            if l<>r then father[r]:=l;
          end;
      end;
  end;
end;
begin
  init;
  main;
end.
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值