等价关系:集合A上的二元关系R 同时具有自反性、对称性和传递性,则称R是 A上的等价关系。
自反性
从给定的关系矩阵来断判关系 R是否为自反是很容易的。 若 M(R的关系矩 阵)的主对角线元素均为 1,则 R是自反关系;若 M( R的关系矩阵)的主对角 线元素均为 0,则 R是反自反关系;若M(R的关系矩阵)的主对角线元素既有 1 又有 0,则 R既不是自反关系也不是反自反关系。
对称性
从给定的关系矩阵来判断关系 R是否为对称是很容易的。 若 M(R的关系矩 阵)为对称矩阵,则 R 是对称关系;若 M 为反对称矩阵,则 R 是反对称关系。
传递的
一个关系 R的可传递性定义告诉我们, 若关系 R是可传递的, 则必有:m ik =1∧m kj =1 mij =1。这个式子也可改写成为: mij =0 mik =0∨m kj =0。我们可以根据后一个公式来完成判断可传递性这一功能的。
编程要求
给定 R 的关系矩阵,据此判断所给关系 R 是否为等价关系。
#define _CRT_SECURE_NO_WARNINGS
#include<iostream>
#include<stdio.h>
using namespace std;
int td(int a[50][50],int n)
{
int i, j, k;
for ( i = 0; i < n; i++)
{
for ( j = 0; j < n; j++)//二重数组遍历关系矩阵
{
if (a[i][j] == 1)//如果第i行j列的元素是1
{
for ( k = 0; k < n; k++)//开始搜索第j行为1的元素
{
if (a[j][k] == 1)
{
if (a[i][k] != 1)
return 0;//如果存在这种情况:第i行第j
//列和第j行第k列的元素均为1,但是第i行第k列的元素不为1,则不具有传递性
}
}
}
}
}
return 1;
}
int main()
{
int n, i, j;
int a[50][50];
cout << "请输入n维矩阵:" << endl;
cin >> n;
cout << "请输入矩阵:" << endl;
for (i = 0; i < n; i++)
{
for (j = 0; j < n; j++)
{
cin >> a[i][j];
}
}
int s = 0;
int r = 0;
for (i = 0; i < n; i++)
{
if (a[i][i] == 1)
{
s++;
}
}
if (s == n)
{
cout << "R具有自反性" << endl;
r++;
}
s = 0;
for (i = 0; i < n; i++)
{
for (j = 0; j < n; j++)
{
if (a[i][j] == a[j][i])
{
s++;
}
}
}
if (s == n * n)
{
cout << "R具有对称性" << endl;
r++;
}
if (td(a, n))
{
cout << "R具有传递性" << endl;
r++;
}
if (r == 3)
{
cout << "R在A上是等价的" << endl;
}
return 0;
}