D 求XF+闭包
题目描述
如何设计一个好的数据库不仅仅是一个理论研究问题,也是一个实际应用问题。在关系数据库中不满足规范化理论的数据库设计会存在冗余、插入异常、删除异常等现象。
设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+,要求按字母序输出。
样例输入
1 6 2 4 ABGDCI AD A B BD I AG C C D
样例输出
ABDI
关于闭包的概念
截取大佬博客的讲述
完整链接 https://www.cnblogs.com/imysql/p/5487213.html
知道了闭包的概念 这个题目就非常简单了,就是一遍遍遍历
#include<iostream>
#include<set>
#include<map>
using namespace std;
int main()
{
int t;
cin>>t;
while(t--)
{
set<char> se;//存最终结果
set<char>::iterator ite;
map<string,string> ma;//对应的字符串的关系
map<string,string>::iterator ite1;
map<string,int> vis;//标记该字符串是否已被加入
int n,m,k;
cin>>n>>m>>k;
string s;
cin>>s;
cin>>s;
int len=s.length();
for(int i=0;i<len;i++)
{
se.insert(s[i]);
}
while(k--)
{
string s1,s2;
cin>>s1>>s2;
ma[s1]=s2;
vis[s1]=0;
}
bool flag=true;
while(flag)
{
flag=false;
for(ite1=ma.begin();ite1!=ma.end();ite1++)
{
string ss=ite1->first;
if(vis[ss]==0)
{
int len=ss.length();
int i;
for(i=0;i<len;i++)
{
ite=se.find(ss[i]);
if(ite==se.end())
break;
}
if(i==len)
{
vis[ss]=1;
flag=true;
string re=ite1->second;
for(i=0;i<re.length();i++)
se.insert(re[i]);
}
}
}
}
for(ite=se.begin();ite!=se.end();ite++)
cout<<*ite;
puts("");
}
return 0;
}