实验内容:
已知关系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;
}