某系统有多个服务,并且服务间可能存在依赖关系。服务之间的依赖是传递性的,即如果一个服务出现故障,它依赖的服务也会受到影响。给定一个依赖关系列表和一个故障服务列表,我们需要找出所有没有故障的服务,并且要求按依赖关系中的出现顺序输出。
首先,我们可以将服务间的依赖关系看作是一个有向图,其中每个节点代表一个服务,每条边表示一个服务依赖于另一个服务。例如,服务 A 依赖服务 B 这条边表示为 A<-B
。因此,我们需要用一个邻接表来表示反向依赖关系(从服务 B 到 A),即每个服务记录哪些其他服务依赖它。
服务之间的依赖是传递性的,也就是说,如果一个服务故障,它依赖的服务也会故障。我们可以使用广度优先搜索(BFS)来传播故障服务,遍历所有与故障服务直接或间接相关的服务。
某系统中有众多服务,每个服务用字符串(只包含字母和数字,长度<=10)唯一标识,服务间可能有依赖关系,如 A 依赖 B ,则当 B 故障时导致 A 也故障。
依赖具有传递性,如 A 依赖 B ,B 依赖 C ,当 C 故障时导致 B 故障,也导致 A 故障。
给出所有依赖关系,以及当前已知故障服务,要求输出所有正常服务。
依赖关系:服务 1 -服务 2 表示“服务 1 ”依赖“服务 2 ”
不必考虑输入异常,用例保证:依赖关系列表、故障列表非空,且依赖关系数,故障服务数都不会超过3000 ,服务标识格式正常。
半角逗号分隔的依赖关系列表(换行)
半角逗号分隔的故障服务列表
依赖关系列表中提及的所有服务中可以正常工作的服务列表,用半角逗号分隔,按依赖关系列表中出现的次序排序。
特别的,没有正常节点输出单独一个半角逗号。
输入
a1-a2,a5-a6,a2-a3
a5,a2
输出
a6,a3
说明
a1 依赖 a2,a2 依赖 a3 ,所以 a2 故障,导致 a1 不可用,但不影响 a3 ;a5 故障不影响 a6 。
所以可用的是 a3、a6 ,在依赖关系列表中 a6 先出现,所以输出:a6,a3。
输入
a1-a2
a2
输出
,
说明
a1 依赖 a2 ,a2 故障导致 a1 也故障,没有正常节点,输出一个逗号。