题目描述

如何设计一个好的数据库不仅仅是一个理论研究问题,也是一个实际应用问题。在关系数据库中不满足规范化理论的数据库设计会存在冗余、插入异常、删除异常等现象。

     设R(U)是一个关系模式,U={ A1,A2, ……, An}。其中Ai是关系的属性,X,Y是U的子集。函数依赖 XàY 定义了数据库中属性集X与Y的依赖关系。根据Armstrong公理,函数依赖满足:

(1)       自反律:若Ai∈X,  则 XàAi .   特别地,Ai àAi .

(2)       增广律:若 XàY,  则 ZXàZY.      (ZX 是指集合Z与X的并集 )

(3)       传递律:若 XàY,  YàZ,  则 XàZ.

(4)       分解律:若 XàY,  则 XàAi        ( 若属性Ai∈Y  )

(5)       合并律:若 XàY,  XàZ,  则 XàYZ.

 已知 F 是关系模式R(U)上的函数依赖集,利用Armstrong公理系统可以推导出更多的函数依赖。设X是属性集U={ A1,A2, ……, An} 的子集, 定义X关于F的闭包XF+

XF+={ Ai | 若Xà Ai可以通过Armstrong公理导出}
对于给定的U , F ,X, 请求出XF+

输入

第一行: T        表示以下有T组测试数据             ( 1≤T ≤5 )

对每组数据,
      第1行: n  m  k       n 表示U中属性个数( 1≤n≤26 ), 用大写字母表示
                              m表示X中属性个数( 1≤m≤26 )
                              k个函数依赖  (1≤ k ≤ 20 )
      第2行:  字符串U      n个大写字母

第3行:  字符串X      m个大写字母

接下来有K行,每行有两个字符串 S T,用一个空格隔开。 表示 SàT
 

输出

对每组测试数据,输出占一行输出XF+,要求按字母序输出。

样例输入 Copy


1
6 2 4
ABGDCI
AD
A B
BD I
AG C
C D


样例输出 Copy


ABDI


解题思路:

这道题难在题意不好懂。求x的闭包规则是这样的:如果s都在b里面,则t就加入b。最后输出b就是x的闭包。

AC代码:

#include<iostream>
#include<set>
#include<string>
#include<algorithm>
using namespace std;
int n,m,k;
struct node{
string l,r;
}s[25];
int main()
{
int T;
cin>>T;
while(T--)
{
cin>>n>>m>>k;
string a,b;
cin>>a>>b;
for(int i=0;i<k;i++)
cin>>s[i].l>>s[i].r;
set<int> st;
for(int i=0;i<b.length();i++)
st.insert(b[i]-'A');
while(true)
{
int f3=0;
for(int i=0;i<k;i++)
{
int f1=0,f2=0;
for(int j=0;j<s[i].l.length();j++)
if(st.find(s[i].l[j]-'A')==st.end())//没找到
{
f1=1;
break;
}
for(int j=0;j<s[i].r.length();j++)
if(st.find(s[i].r[j]-'A')==st.end())//没找到
{
f2=1;
break;
}
if(f1==0&&f2==1)
{
f3=1;
for(int j=0;j<s[i].r.length();j++)
st.insert(s[i].r[j]-'A');
}
}
if(f3==0) break;//如果从1到k循环完,b没有变化,就说明x的闭包求出来了
}
set<int>::iterator it;
for(it=st.begin();it!=st.end();it++)
cout<<(char)((*it)+'A');
}
return 0;
}