通过矩阵的方式去求解三种关系矩阵。
自反:矩阵的对角线都应该为1。例:如果为3×3矩阵则g[0][0]=1,g[1][1]=1,g[2][2]=1。如果不为1,则输出相应的关系。
对称:关于对角线矩阵应该对称。例:g[i][j]=1,则g[j][i]也应该为1。所以根据这种思路判断对称闭包。
传递:通过warshall算法去求传递闭包。
for (int k = 0; k < n; k++)
{
for (int i = 0; i < n; i++)
{
for (int j = 0; j < n; j++)
{
if (g[i][k] && g[k][j])
g[i][j] = 1;
}
}
}
全代码:
输入集合形式:{a,b,c...}
输入关系形式:({<a,a>,<a,b>....}
输出形式:{<a,a>.....}
#include<iostream>
using namespace std;//闭包运算
char zi[26] = { 'a','b','c','d','e','f','g','h','i','j','k','l','m','n','o','p','q','r','s','t','u','v','w','s','y','z' };
int main()
{
string A, B;
cout << "输入集合:(输入形式{a,b,c...})" << endl;
cin >> A;
cout << "输入关系:(输入形式({<a,a>,<a,b>....})" << endl;
cin >> B;
int g[100][100];
int n = A.length() / 2;
for (int i = 0; i < n; i++)
for (int j = 0; j < n; j++)
g[i][j] = 0;
char a[100][2];
int k = 0, t = 0;
for (int i = 0; i < B.length(); i++)
{
if (i % 2 == 0 & i % 3 != 0)
{
a[k][t++] = B[i];
}
if (t == 2)
{
k++;
t = 0;
}
}
int a1[100][2];
for (int i = 0; i < k; i++)
a1[i][0] = a[i][0] - 'a', a1[i][1] = a[i][1] - 'a';
cout << "关系矩阵:" << endl;
for (int i = 0; i < k; i++)
g[a1[i][0]][a1[i][1]] = 1;
for (int i = 0; i < n; i++)
{
for (int j = 0; j < n; j++)
cout << g[i][j] << " ";
cout << endl;
}
cout << "自反闭包 " << "{";
for (int i = 0; i < n; i++)//自反闭包
{
if (g[i][i] == 0)
cout << "<" << zi[i] << "," << zi[i] << ">";
for (int j = 0; j < n; j++)
{
if (g[i][j] == 1)
cout << "<" << zi[i] << "," << zi[j] << ">";
}
}
cout << "}" << endl;
cout << "对称闭包" << "{";
for (int i = 0; i < n; i++)//对称闭包
{
for (int j = 0; j < n; j++)
{
if (g[i][j] == 1 && g[j][i] == 0)
cout << "<" << zi[j] << "," << zi[i] << ">";
if (g[i][j] == 1)
cout << "<" << zi[i] << "," << zi[j] << ">";
}
}
cout << "}" << endl;
cout << "传递闭包" << "{";
for (int k = 0; k < n; k++)
{
for (int i = 0; i < n; i++)
{
for (int j = 0; j < n; j++)
{
if (g[i][k] && g[k][j])
if (g[i][j] == 0)
{
cout << "<" << zi[i] << "," << zi[j] << ">";
}
}
}
}
for (int i = 0; i < n; i++)
{
for (int j = 0; j < n; j++)
if(g[i][j]==1)
cout << "<" << zi[i] << "," << zi[j] << ">";
}
cout << "}";
}