#P1479. MBone

    ID: 480 传统题 1000ms 256MiB 尝试: 3 已通过: 1 难度: 10 上传者: 标签>图结构模拟数据结构搜索Southwestern European Regional Contest 1997

MBone

描述
MBone是“Multicast Backbone”(多播骨干网)的缩写。它是建立在互联网协议之上的虚拟网络的实现。与面向连接的数据传输(单播)从发送者到网络中所有目的地的传输(广播)不同,MBone提供了多播功能,即向所有加入“多播组”的主机发送数据的能力。组的所有成员都可以向组发送数据并从组接收数据。

你的程序需要模拟一个简化版的MBone。在我们的设定中,MBone由多播路由器主机组成,每个主机属于一个路由器。一个路由器及其所属的主机称为一个“岛屿”。路由器之间通过隧道连接,隧道是简单的通信通道:从一端发送的数据包会在另一端接收。

为了加入一个多播组,主机必须向其对应的多播路由器发送一个协议消息,指定它想要加入的组的地址。这样,该主机将接收发送到该组的所有数据包。

为了向多播组发送数据包,主机将数据包发送到其所在岛屿的多播路由器。每个多播路由器会复制所有接收到的数据包,并通过其每个出站隧道发送。然后,它将数据包的副本发送给岛屿上所有已加入该组的主机。

数据包在MBone中的分发范围通过一个称为TTL(Time To Live,生存时间)的整数值来限制。每个数据包都有一个TTL值。如果数据包通过隧道发送,其TTL会减去该隧道的阈值(一个整数值)。如果数据包的TTL小于隧道的阈值,则不会通过该隧道发送。


输入
程序的输入将包含多个MBone网络的描述。每个描述的第一部分定义了网络拓扑,第二部分描述了该网络上的活动

  • 第一部分的第一行包含一个整数m(1 < m ≤ 10),表示网络中的岛屿数量。m = 0表示输入结束。接下来的几行包含m个岛屿的描述

    • 每个岛屿描述的第一行是多播路由器的名称(最多20个非空字符的字符串),后跟一个整数,表示岛屿描述中剩余的行数。这些行可以是以下两种类型之一:
      1. 属于岛屿的主机H <主机地址>
      2. 隧道T <阈值> <目标名称>
      • <主机地址><阈值>是正整数,分别指定主机的地址和隧道的阈值。
      • <目标名称>是隧道另一端的目标路由器的名称,该名称始终与当前路由器不同。
  • 第二部分的第一行包含一个不超过1000的整数,表示接下来的活动描述的行数。每行描述一个主机的活动:

    1. 加入组J <主机地址> <组地址>
    2. 离开组L <主机地址> <组地址>
    3. 向组发送数据包S <主机地址> <组地址> <数据包ID> <TTL>
    • <组地址><数据包ID><TTL>是正整数,含义显而易见。
    • 路由器名称、主机地址和数据包ID在同一个场景中都是唯一的
    • 数据包的TTL最多为1000
    • 网络中最多有50个主机100条隧道,任何时候最多有20个活跃组(即至少有一个主机成员的组)。
    • 主机不会尝试离开它未加入的组,也不会尝试加入它已加入的组。

输出
在输出中,你需要为每个场景打印网络中主机接收到的数据包。如果主机接收到多个副本的数据包(通过不同路径路由),它们只保留TTL最高的副本(通过“最短”路径到达)。

对于每个网络描述:

  1. 首先输出网络编号,如示例所示。
  2. 随后的每行格式为:
    <主机地址> <数据包ID> <TTL>
    • 表示主机<主机地址>接收到了ID为<数据包ID>、剩余TTL为<TTL>的数据包。
    • 行的三个条目之间用单个空格分隔。
  3. 输出必须按升序排序:首先按主机地址,其次按数据包ID。
  4. 每个测试用例后输出一个空行

示例输入 1

3  
Nuremberg 3  
T 8 Munich  
H 3768  
H 3669  
Munich 6  
H 721  
H 722  
H 723  
T 6 Nuremberg  
H 857  
T 9 Ulm  
Ulm 5  
H 51225  
H 51226  
H 51227  
T 15 Nuremberg  
T 9 Munich  
14  
J 51227 26  
J 3768 27  
J 723 26  
J 3768 26  
S 3768 26 1000 17  
J 857 26  
S 3768 26 320 16  
J 722 26  
L 857 26  
S 51227 26 1001 37  
S 723 26 533 5  
L 51227 26  
L 3768 27  
L 723 26  
0  

示例输出 1

Network #1  
722 533 5  
722 1001 28  
723 320 8  
723 533 5  
723 1000 9  
723 1001 28  
857 320 8  
3768 320 16  
3768 1000 17  
3768 1001 22  
51227 1000 0  
51227 1001 37  

来源
1997年西南欧区域赛