AlgoMooc
你已开通华为OD训练营权益,还差最后一步——完成入营激活(兑换课程 + 加飞书 + 登记服务群),即可解锁全部课程与专属服务。去激活 →
← 返回题库

K0102. 有向图故障节点巡检

中等通过率 100% · 提交 5 · 通过 5
图论DFSBFS拓扑排序

小慕正在设计一套法术网络,许多法术节点通过单向能量通道相连,构成了一个复杂的系统。 每个法术节点有唯一编号,并且可能属于以下两类之一: * 普通节点 * 印记节点 某一时刻,恰好有一个法术节点成为唯一的故障源。故障会沿着能量通道不断扩散,所有能够被它沿有向路径到达的下游节点,都会收到异常信号。 为了防止系统崩溃,小慕制定了如下检查规则: 1. 故障源一定要进行检查。 2. 如果某个印记节点收到了异常信号,那么这个印记节点也必须进行检查。 3. 如果某个必须检查的法术节点本身是印记节点,那么它的所有上游法术节点也都必须进行检查。 4. 规则3会不断递归生效,直到不会再新增需要检查的法术节点为止。 现在给出整张能量网络、所有印记节点以及唯一的故障源,请你输出所有需要检查的法术节点编号,按升序输出。 如果存在一条从 `u` 到 `v` 的有向路径,则称: * `v` 是 `u` 的下游法术节点 * `u` 是 `v` 的上游法术节点 注意:这张图不保证无环。

提示:带虚线的词点一下有通俗解释。

输入描述

第一行输入两个整数 `n` 和 `k`,分别表示魔法塔总数与符印塔数量。 接下来 `n` 行,每行描述一座魔法塔的出边信息,格式为: `id c to1 to2 ... toc` 含义如下: * `id` 表示当前魔法塔编号 * `c` 表示它直接连接的下游魔法塔数量 * `to1 ... toc` 表示这些下游魔法塔的编号 接下来 `k` 行,每行一个整数,表示一座符印塔的编号。 最后一行输入一个整数 `origin`,表示唯一的诅咒源编号。 * `1 <= n <= 10000` * `0 <= k <= 1000` * `0 <= c <= 100` * `1 <= id <= 10000` 输入保证: * 所有魔法塔编号互不相同 * 所有出边指向的编号都出现在给定的 `n` 座魔法塔中

输出描述

输出一行,包含所有需要巡检的魔法塔编号,按升序排列,编号之间用空格分隔。

示例

示例 1

输入

7 2
12 2 25 31
25 1 44
31 0
44 2 57 63
57 1 71
63 1 71
71 0
44
71
57

输出

12 25 44 57 63 71

说明:* 诅咒源是 `57`,因此 `57` 一定需要巡检。 * 诅咒会传到下游的 `71`。 * `71` 是符印塔,并且收到了异常回响,因此 `71` 也需要巡检。 * 由于 `71` 是需要巡检的符印塔,所以它的所有上游魔法塔也都需要巡检,即 `63`、`44`、`25`、`12`、`57`。 * 最终需要巡检的魔法塔为 `12 25 44 57 63 71`。

示例 2

输入

5 1
101 1 205
205 1 330
330 2 410 520
410 0
520 1 330
330
330

输出

330

时间限制 1000 ms · 内存限制 128 MB

看不懂题目?点开图解
12 25 44 57 63 71 诅咒源 57 橙色节点为符印塔,箭头表示秘脉方向
写完代码点「提交」,将对全部测试用例判题。

向老师提问

针对「有向图故障节点巡检」把疑问、代码和报错填清楚,老师收到后能更快、更准地回复你。