查找是否可以进行数据通信

时间:2014-07-04 17:14:05

标签: algorithm graph-theory

在x轴上提供N个路由器,并且希望彼此通信。如果一个路由器之间的距离小于或等于K,则可以向另一个路由器发送消息。

给出P对路由器,它们想要发送消息。我们需要告诉" Y"或" N"这对之间的天气数据传输是否可能。

注意:X轴上的同一个点上可以有多个路由器。

约束:

1 ≤ N, P ≤ 10^5
0 ≤ Ai, K ≤ 10^9
1 ≤ A, B ≤ N

所以我想为每个查询提供一个非常有效的算法。

如果我们有5个路由器,K = 3和2个查询如下:

路由器的位置:= 0 3 8 5 12

查询1:1 2

这里的回答是" Y"因为两者都在彼此的范围内

查询2:1 3

这里的回答是" Y"因为两者都在彼此的范围内 对于对(1,3),路由器1可以向路由器2发送消息,路由器2可以将其发送到路由器4,并且可以将其发送到路由器3.

3 个答案:

答案 0 :(得分:0)

首先映射路由器位置/距离:

List<int> Routers=new List<int>();

Routers.Add(0);
//....
Routers.Add(12);

创建配对:

class Pairs
{
int[2] Pair;
}

List<Pair> Pairings=new List<Pair>();


Pairings.Add({Routers.IndexOf(0),Routers.IndexOf(1)});
Pairings.Add({Routers.IndexOf(0),Routers.IndexOf(2)});

创建检查方法:

private bool CanCommunicate(intx i1,inti2)
{
    if (Math.Abs(i1-i2)<=K
    return true;
    else
    return false;
}

实施alg:

foreach (Pair p in  Pairings)
{
  if(CanCommunicate(p[0],p[1])
  return "Y";;
  else 
  return "N";
}

代码位于C#

答案 1 :(得分:0)

路由器在x轴上,因此如果它们之间的差异小于边界,则两个路由器可以直接通话;如果在x轴上它们之间的路径上的路由器之间没有间隙,则两个路由器可以间接通话很大,消息无法通过。

因此,按照x轴上升位置的顺序对路由器进行排序,然后按升序x的顺序对它们进行排序,并将它们分解为不包含太大间隙的路由器。对运行进行编号,然后两个路由器可以进行通信,当且仅当它们都在相同的数字运行中时才会进行通信。

答案 2 :(得分:0)

鉴于间接通信,我首先要找到间隙,沿着x轴的位置,两个相邻路由器之间的间隔太大,无法进行通信。

对于每个路由器,记录下一个间隙的位置。将线的末端视为间隙。

当且仅当两个路由器共享相同的下一个间隙时,它们才能进行通信。

=============================================== =============================

Sort the list of routers in ascending x co-ordinate order

Initialize integer groupIndex to 0.

For each router in x co-ordinate order:
  Mark it with the current groupIndex
  If there is a next router and it is more than distance K away, increment groupIndex

Two routers can communicate if, and only if, they are marked with the same groupIndex.