#include <iostream>
#include <string.h>
using namespace std;
const int MAX = 100;
int num;
int rnum;
int R[MAX][MAX];
int A[MAX][MAX];
void Warshall() //Warshall算法
{
for (int i = 1; i <= num; i++) //置新矩阵A
{
for (int j = 1; j <= num; j++)
{
A[i][j] = R[i][j];
}
}
for (int i = 1; i <= num; i++) //对所有j如果A[j,i]=1,则对k=1,2,...,n ;A[j][k] = A[j][k] + A[i][k];
{
for (int j = 1; j <= num; j++)
{
if (A[j][i] == 1)
{
for (int k = 1; k <= num; k++)
{
A[j][k] = A[j][k] + A[i][k];
if (A[j][k] >= 1)
{
A[j][k] = 1;
}
}
}
}
}
}
int Zifan() //自反性 对角线为1
{
for (int i = 1; i <= num; i++)
{
if (R[i][i] != 1)
return 0;
}
return 1;
}
int Duichen() //对称性 以对角线对称的元素同时为1
{
for (int i = 1; i <= num; i++)
{
for (int j = 1; j <= num; j++)
{
if (R[i][j] != R[j][i])
return 0;
}
}
return 1;
}
int Chuandi() //传递性 利用Warshall,t(R)=R;
{
Warshall();
for (int i = 1; i <= num; i++)
{
for (int j = 1; j <= num; j++)
{
if (A[i][j] != R[i][j])
return 0;
}
}
return 1;
}
int Fanzifan() //反自反性 对角线元素为0
{
for (int i = 1; i <= num; i++)
{
if (R[i][i] == 1)
return 0;
}
return 1;
}
int Fanduichen() //反对称性 以对角线对称的元素不能同时为1
{
for (int i = 1; i <= num - 1; i++)
{
for (int j = i + 1; j <= num; j++)
{
if (R[i][j] == 1 && R[j][i] == 1)
{
if (i != j)
return 0;
}
}
}
return 1;
}
int main()
{
cout << "集合的元素个数为:";
cin >> num;
cout << "集合的关系个数为:";
cin >> rnum;
memset(R, 0, sizeof(R)); //将R中当前位置后面的用 0 替换,并返回 R
memset(A, 0, sizeof(A));
int t1, t2;
cout << "请输入集合的序偶:" << endl;
for (int i = 1; i <= rnum; i++)
{
cin >> t1 >> t2;
R[t1][t2] = 1;
}
cout << "该集合符合的二元性质有:" << endl;
if (Zifan())
cout << "自反性;";
if (Duichen())
cout << "对称性;";
if (Chuandi())
cout << "传递性;";
if (Fanzifan())
cout << "反自反性;";
if (Fanduichen())
cout << "反对称性;" << endl;
return 0;
}
大二(上)离散数学 集合的二元关系
最新推荐文章于 2023-05-15 12:40:39 发布