P13321 [GCJ 2012 #1C] Diamond Inheritance

题目描述

你需要帮助诊断类图,以识别菱形继承的实例。下面的类图示例说明了菱形继承的特性。共有四个类:$A, B, C$ 和 $D$。箭头从 $X$ 指向 $Y$ 表示类 $X$ 继承自类 $Y$。 ![](https://cdn.luogu.com.cn/upload/image_hosting/g3yse0or.png) 在这个类图中,$D$ 同时继承自 $B$ 和 $C$,$B$ 继承自 $A$,而 $C$ 也继承自 $A$。从 $X$ 到 $Y$ 的继承路径被定义为一个类序列 $X, C_1, C_2, C_3, \dots, C_n, Y$,其中 $X$ 继承自 $C_1$,对于 $1 \leq i \leq n-1$,$C_i$ 继承自 $C_{i+1}$,$C_n$ 继承自 $Y$。在上面的例子中,从 $D$ 到 $A$ 存在两条继承路径。第一条路径为 $D, B, A$,第二条路径为 $D, C, A$。 如果存在一对类 $X$ 和 $Y$,使得从 $X$ 到 $Y$ 存在至少两条不同的继承路径,则称该类图包含菱形继承。上面的类图就是菱形继承的经典示例。你的任务是判断给定的类图是否包含菱形继承。

输入格式

输入的第一行为测试用例数 $T$。接下来有 $T$ 组测试数据,每组描述一个类图。每组数据的第一行为该类图的类数 $N$。类的编号为 $1$ 到 $N$。接下来有 $N$ 行。第 $i$ 行以一个非负整数 $M_i$ 开头,表示第 $i$ 个类继承的类的数量。随后是 $M_i$ 个不同的正整数,范围均为 $1$ 到 $N$,表示这些被继承的类。你可以假设: * 如果存在从 $X$ 到 $Y$ 的继承路径,则不存在从 $Y$ 到 $X$ 的继承路径。 * 不会有类继承自身。

输出格式

对于每个类图,输出一行 "Case #$x$: $y$",其中 $x$ 为测试用例编号(从 $1$ 开始),$y$ 若该类图包含菱形继承则为 "Yes",否则为 "No"。

说明/提示

**限制条件** - $1 \leq T \leq 50$ - $0 \leq M_i \leq 10$ **测试集 1(14 分,结果可见)** - $1 \leq N \leq 50$ **测试集 2(14 分,结果隐藏)** - $1 \leq N \leq 1,000$ 翻译由 ChatGPT-4.1 完成。