离散数学实验5:二元关系 本题判断二元关系的性质:自反性(reflexive)、对称性(symmetrical)、传递性(transitive)。

输入格式:
输入关系矩阵的阶数n(n<=10),接着输入如具有关系R的元素下标(i,j),输入 -1 -1,结束输入。判断该二元关系具有的性质。

输出格式:
输出二元关系a的性质,如果具有自反性性,则显示“a is reflexive”,如果具有对称性,则显示“a is transitive”,如果具有传递性,则显示“a is transitive”,如果具有自反性、对称性、传递性,则显示具有等价性“a is equivalent”。如果输入的n大于10,或者输入的数组元素下标i,j大于等于n(数组元素的下标应小于n),则显示"error",并结束程序。注意每个显示前后无空格,末尾回车。

输入样例:
在这里给出一组输入。例如:

3
1 0 2 0 0 1 2 1 0 2 1 2 -1 -1
输出样例:
在这里给出相应的输出。例如:

a is symmetrical



#include <iostream>
using namespace std;

#define MAX 1000
bool flag_ref,  flag_sym,  flag_tra;  //自反性、对称性、传递性
int a[MAX][MAX];
int n;

//自反性
void  Reflexive() {
    flag_ref = 1;
    for (int i = 0; i < n; ++i) {
        if (a[i][i] != 1) {  //只要有一个对角线元素为 0:即不满足
            flag_ref = 0;
            break;
        }
    }
    if (flag_ref) {
        cout << "a is reflexive" << endl;
    }
}



//对称性
void  Symmetrical()
{
flag_sym = true;
    for(int i = 0; i < n; i++)
    {
        for(int j = 0; j <n; j++)
        {
            if(a[i][j] !=a[j][i])
            {
                flag_sym = false;
            }
        }
    }
    if(flag_sym == true)
    {
        cout << "a is symmetrical" << endl;
    }
}




//传递性
void Transitive() {
    flag_tra = 1;
    for (int i = 0; i < n; ++i) {
        for (int j = 0; j < n; ++j) {
            for (int k = 0; k < n; ++k) {
                if (a[i][j] && a[j][k] && !a[i][k]) {  //前两个为 1,第三个为 0
                    flag_tra = 0;
                    break;
                }
            }
        }
    }
    if (flag_tra) {
        cout << "a is transitive" << endl;
    }
}
int main() {
    int i = 0;
    int j = 0;
    cin >> n ;
    cin >> i >> j;
    if(n>10){
        cout<<"error";
        return 0;
    }
    
    while (i != -1 && j != -1) {
        if (i >= n || j >= n)
        {
            cout << "error";
            return 0;
        }
        a[i][j] = 1;
        cin >> i >> j;
    }
    
    Reflexive();
    Symmetrical();
    Transitive();
    if (flag_ref && flag_sym && flag_tra) {
        cout << "a is equivalent" << endl;
    }
    

    return 0;
}
 

先形成关系矩阵,如果是自反的,对角线上的矩阵为1,如果是对称的,则矩阵相对于对角线上对称。如果是传递的计算矩阵的自相乘,判断2次矩阵和元矩阵同位置元素是否同时为0或不为0