#P1237. 冗余依赖

冗余依赖

题目描述

在设计关系数据库的表格时,术语“函数依赖”(FD)被用来表示不同域之间的关系。函数依赖是描述一个集合中的域的值与另一个集合中的域的值之间的关系。记号 XYX \to Y 被用来表示当集合 XX 中的域被赋值后,集合 YY 的域就可以确定相应的值。例如,一个数据表格包含“社会治安编号”(SS)、“姓名”(NN)、“地址”(AA)、“电话”(PP)的域,并且每个人都与某个特定的互不相同的 SS 值相对应,根据域 SS 就可以确定域 NNAAPP 的值。这就记作 S{N,A,P}S \to \{N,A,P\}

写一个程序以找出一组依赖中所有的冗余依赖。一个依赖是冗余的是指它可以通过组里的其他依赖得到。例如,如果组里包括依赖 ABA \to BBCB \to CACA \to C,那么第三个依赖是冗余的,因为域 CC 可以用前两个依赖得到(域 AA 确定了域 BB 的值,同样域 BB 确定了域 CC 的值)。在 ABA \to BBCB \to CCAC \to AACA \to CCBC \to BBAB \to A 中,所有的依赖都是冗余的。

现在要求你编写一个程序,从给定的依赖关系中找出冗余的。

输入格式

第一行是一个不超过 100100 的整数 nn,它表示文件中函数依赖的个数。

从第二行起每一行是一个函数依赖且互不重复,每行包含用字符 -\verb!-!>\verb!>! 隔开的非空域列表。列表月包含大写的字母,函数依赖的数据行中不包括空格和制表符,不会出现“平凡”冗余依赖(如 AAA \to A)。虽然文件中没有对函数依赖编号,但其顺序就是编号 11nn

输出格式

每一行输出一个冗余依赖,以及其他依赖的一个序列以说明该依赖是冗余的。格式为 $\texttt{FD}\ x\ \texttt{is redundant using FDs:}\ p_1\ p_2 \cdots p_k$。其中 xx 是冗余的依赖的编号,p1,p2,,pkp_1,p_2,\cdots,p_k 是用来证明 xx 是冗余依赖的依赖序列。

如果许多函数依赖的序列都能被用来说明一个依赖是冗余的,则输出其中最短的证明序列。

如果这些函数依赖中不包含冗余依赖,则输出 No redundant FDs

3
A->BD
BD->C
A->C

FD 3 is redundant using FDs: 1 2

6
P->RST
VRT->SQP
PS->T
Q->TR
QS->P
SR->V

FD 3 is redundant using FDs: 1
FD 5 is redundant using FDs: 4 6 2

提示

样例 1 解释

依赖关系 33 是冗余的。因为 ACA\to C 可以使用前两个依赖关系 A{B,D}A\to \{B,D\}{B,D}C\{B, D\}\to C 得到。