關係性質

實驗內容:

已知關係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;
}

發佈了26 篇原創文章 · 獲贊 2 · 訪問量 4699
發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章