m0_63220286 2022-05-16 08:29 采纳率: 33.3%
浏览 450
已结题

离散数学实验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

  • 写回答

2条回答 默认 最新

  • 澈351 2022-05-17 20:32
    关注
    
    
    #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条)

报告相同问题?

问题事件

  • 系统已结题 6月3日
  • 专家已采纳回答 5月26日
  • 创建了问题 5月16日

悬赏问题

  • ¥15 安卓adb backup备份应用数据失败
  • ¥15 eclipse运行项目时遇到的问题
  • ¥15 关于#c##的问题:最近需要用CAT工具Trados进行一些开发
  • ¥15 南大pa1 小游戏没有界面,并且报了如下错误,尝试过换显卡驱动,但是好像不行
  • ¥15 没有证书,nginx怎么反向代理到只能接受https的公网网站
  • ¥50 成都蓉城足球俱乐部小程序抢票
  • ¥15 yolov7训练自己的数据集
  • ¥15 esp8266与51单片机连接问题(标签-单片机|关键词-串口)(相关搜索:51单片机|单片机|测试代码)
  • ¥15 电力市场出清matlab yalmip kkt 双层优化问题
  • ¥30 ros小车路径规划实现不了,如何解决?(操作系统-ubuntu)