关系性质

来源:互联网 发布:ios 无网络界面 编辑:程序博客网 时间:2024/04/29 09:22

实验内容:

已知关系R由关系矩阵M给出,要求判断由M表示的这个关系是否为自反关系、对称关系、传递关系。

算法分析:

1. 若M(R的关系矩阵)的主对角线元素均为1,则R是自反关系;若M(R的关系矩阵)为对称矩阵,则R是对称关系;相关算法步骤:

① 输入关系矩阵M(M为n阶方阵);

②判断自反性,对于i=1,2,…,n;若存在mii=0,则R不是自反的;转⑤

③ 判断对称性,对于i=2,3,…,n;j=1,2,……,i-1,若存在mij≠mji,则R不是对称的;转⑤

④ R是自反的、对称的

⑤ 结束

2. 若关系R是可传递的,则必有:mik=1∧mkj=1 mij=1。这个式子也可改写成为: mij =0 mik =0∨mkj=0。我们可以根据后一个公式来完成判断可传递性这一功能的。

① 输入关系矩阵M(M为n阶方阵);

② 1i

③ 若i>n,转⑬

④ 1j

⑤ 若j>n,转⑫

⑥ 若mij=1,转⑪

⑦ 1k

⑧ 若k>n,转⑪

⑨ 若mik*mki=1,则R不是可传递的,转⑭

⑩ k+1k,转

11 j+1j,转

12 i+1i,转③

13 R是可传递的

14 结束


实现:

#include<iostream>
using namespace std;


const int SIZE=40;


int reflexiveRelation(int matrixRelations[SIZE][SIZE], int);             //定义判断矩阵是否自反的函数
int symmetry(int matrixRelations[SIZE][SIZE], int);        //定义判断矩阵是否对称的函数
int transmit(int matrixRelations[SIZE][SIZE], int);        //定义判断矩阵是否传递的函数


int main()
{
int i,j,b = 0,a = 1;
int l, m, n;
int matrixRelation[SIZE][SIZE];   //定义关系矩阵


cout<<"请输入关系矩阵:"<<endl;
//输入关系矩阵
for(i = 0; ; i++,a++)
{
for (j = 0; ; j++) 
{
cin>>matrixRelation[i][j];
b++;
if( getchar() == '\n')
{
break;
}
}
if (a == b)
{
break;
}
b = 0;
}


l = reflexiveRelation(matrixRelation,a);                 //自反
m = symmetry(matrixRelation,a);            //对称
n = transmit(matrixRelation,a);            //传递


if (l)
cout<<endl<<"这个关系是自反关系"<<endl;  
else
cout<<endl<<"这个关系不是自反关系"<<endl;  


if (m)
cout<<endl<<"这个关系是对称关系"<<endl;
else
cout<<endl<<"这个关系不是对称关系"<<endl;

if (n)
cout<<endl<<"这个关系是传递关系"<<endl<<endl;
else
cout<<endl<<"这个关系不是传递关系"<<endl<<endl;


return 0;
}


/**************************************************************
[函数名]:reflexiveRelation
[功能]:判断矩阵是否自反
[参数]:matrixRelation(关系矩阵),n(矩阵的阶数)
[实现]:判断矩阵的主对角线元素是否均为1,若是,则返回1,反之,返回0
[返回值]:1或0
**************************************************************/
int reflexiveRelation(int matrixRelations[SIZE][SIZE], int n)
{
int i;
for (i = 0; i < n; i++)
if (matrixRelations[i][i] != 1)
{
return 0;
}


return 1;
}


/**************************************************************
[函数名]:symmetry
[功能]:判断矩阵是否对称
[参数]:matrixRelation(关系矩阵),n(矩阵的阶数)
[实现]:判断任意matrixRelation[i][j]是否等于matrixRelation[j][i]
  若均等于,则放回1,反之,返回0
[返回值]:1或0
**************************************************************/
int symmetry(int matrixRelations[SIZE][SIZE], int n)
{
int i,j;
for (i = 0; i < n; i++)
for (j = 0; j < n; j++)
{
if (i != j)
{
if (matrixRelations[i][j] != matrixRelations[j][i])
{
return 0;
}
}
}


return 1;
}


/**************************************************************
[函数名]:transmit
[功能]:判断矩阵是否传递
[参数]:matrixRelation(关系矩阵),n(矩阵的阶数)
[实现]:若对于任意第i行k列元素与第k行j列都为1,满足第i行j列元素为1
  则返回1,反之,返回0         (十字型法)
[返回值]:1或0
**************************************************************/
int transmit(int matrixRelations[SIZE][SIZE], int n)
{
int i = 0, k = 0, j = 0;
 
for (i = 0; i < n; i++)
for (j = 0; j < n; j++)
for (k = 0; k < n; k++)
if ((matrixRelations[i][k] == 1) && (matrixRelations[k][j] == 1))
{
if (matrixRelations[i][j] == 0)
{
return 0;
}
}


return 1;
}

0 0