最近,研究中心迎来了一次扩建。扩建完成后,Higuchi发现网络的延迟似乎上升了。于是她找来
了Yuki帮忙解决这个问题。
为了分析网络路由情况,路由追踪是一种常用的手段。作为内部网络,研究中心的计算机网络采用的是
静态路由,因此不需要真的发送数据包,只要有网络的拓扑结构和各主机的路由表就能完成路由追踪。
现在,对于给定的网络结构和路由表、源IP地址和目的IP地址,请你完成路由追踪,找出路由中所有主
机的IP。
下面将介绍本题中使用的简化网络模型。对于与现实中不同的部分,请以这里的描述为准。
计算机网络在逻辑上可以看作一张无向图,其中结点对应网络中的主机(或者交换机、路由器),边可
以看作网线。数据包可以从一台主机被转发到相邻的另一台主机。通过不断地转发,网络中任意两台主
机都可以互相通信。
网络中每台主机有唯一的IP地址(IP),用来在网络上标志这台主机。IP地址是一个32位无符号整
数,例如十六进制整数c0 a8 03 ae是一个有效的IP地址。这种表示方法不利于人类理解,因此规
定IP地址也可以被表示为4组十进制整数,其中每一组整数在[0, 255]范围内,对应完整地址的8个二进制
位。例如,前面提到的地址c0 a8 03 ae在这种表示下可以被写成192.168.3.174。
为 了 表 示 一 类 相 似 的IP, 可 以 使 用CIDR。 一 个CIDR形 如192.168.0.0/16, 后 面 的/16称 为 前
缀长度,表示只有前16个二进制位是有效的。这个CIDR包含所有前16位等于192.168,后16位
从0.0到255.255任意取值的65536个IP。注意前缀长度未必是8的倍数,例如28.0.0.0/6是一个有效
的CIDR,它包含所有前6个二进制位是000111的2
26个IP。如果一个IP被一个CIDR包含,称这个IP匹配
这个CIDR。例如,192.168.3.174匹配192.168.0.0/16,但不匹配28.0.0.0/6。
数据包有两个关键的属性,源IP地址和目的IP地址。当主机A想要向主机B传递信息,它创建一个数
据包,将源地址属性设置为自己的IP,目的地址设置为主机B的IP。然后,主机A选择一台有网线直接
相连的主机C,将数据包发送给主机C。主机C会将数据包转发给相邻的主机D,然后收到数据包的主
机D再次转发,直到主机B收到数据包。
在数据包的转发过程中,一个关键的问题就是,如果有多台主机相邻,如何选择转发的目标。事实上,
每台主机都维护有一个路由表。表中的每一项包含两个字段,目的CIDR和转发IP。当主机收到一个数
据包,它按如下顺序操作。
1. 检查数据包目的IP是否为本机。如是,接受数据包并不再转发。
2. 从路由表中选择一条记录,数据包的目的IP必须匹配这条记录的目的CIDR。
3. 将数据包原样转发给上一步中选中记录的转发IP对应的那台主机。
有 时 , 一 个IP可 以 匹 配 多 个CIDR, 也 就 导 致 一 个 数 据 包 可 以 匹 配 路 由 表 中 多 条 记 录 。 例
如192.168.3.174既匹配192.168.0.0/16,也匹配0.0.0.0/0。此时规定主机将选择前缀长度最大的
那条记录。
按照上面的规则,一个数据包将从源主机开始,经过若干主机的转发,最终被目的主机接受。这个过程
中数据包经过的主机(包括源和目的)称为数据包的路由。路由追踪就是要找出一个数据包路由中的所
有主机的IP。
到达目的主机。
接下来1行,包含一个整数n(1 ≤ n ≤ 105
),表示网络中的主机数。
接下来依次描述每台主机。其中第1行包含一个IP和一个非负整数ki(
Pki ≤ 106
),依次表示主机i的IP和
路由表项数。接下来ki行,每行描述主机i的路由表中的一项,包括目的CIDR和转发IP,用空格隔开。
保证每台主机的IP唯一,所有的CIDR和IP都是合法的,所有转发IP都与主机i直接相连。
对于前30%的数据,n ≤ 1000。
对于前50%的数据,ki ≤ 1。
没有在主机i的路由表中出现的主机均不与主机i直接相连。换句话说,网络结构中所有的边都由路由表
的目的IP给出。
在本题中,IP地址仅作为主机的唯一标识符。不需要特殊处理127.0.0.1或者255.255.255.255等保留
地址。