c语言实现等价关系的判断以及等价类的输出

2023-11-01

原理:

设X={1,2,3,......,n},关系R的关系矩阵是M=(mij)

判断等价关系

(1)R是自反的<=>m11=m22=......=mnn=1

  (2)   R是对称的<=>M=M^{T}<=>mij=mji

  (3)   R是传递的<=>tr(R)=R

求等价类

如果mij=1,即iRj,则j\subseteq [i]R

算法:

Step1 写出n元集合X上关系R的关系矩阵M=(mij)

Step2 for i=1 to n

              如果mii=0,则停止,关系R不是自反的.

Step3 for i=1 to n

           for j=1+i to n

                       如果mij != mji,则停止,关系R不是对称的

Step4  求传递闭包的关系矩阵A

            如果A!=M,则停止,关系R不是传递的。

Step5 令B={}(空集,用于放置等价类元素)

Step6  令X= X-B(X 存放剩余元素)

Step7  如果X为空,则停止,否则令i是X中最小元素,B={}空集,B=B交{i}

Step8 for j=1 to n

           如果mij=1,则B=B交{i}

Step9 按行输出B得到一个等价类,转到Step6

代码实现:

以X={1,2,3,4,5,6},R={(1,1),(2,2),(3,3),(4,4),(5,5),(6,6),(1,4),(2,3),(2,6),(3,2),(3,6),(4,1),(6,2),(6,3)}为例,给出代码

#include <stdio.h>
#include <stdlib.h>

int main()
{
    int x[6]={1,2,3,4,5,6};
    //写出关系矩阵
    int Mr[6][6]={{1,0,0,1,0,0},{0,1,1,0,0,1},{0,1,1,0,0,1},{1,0,0,1,0,0},{0,0,0,0,1,0},{0,1,1,0,0,1}};
    int n=6;
    //判断关系是否自反
    int flag=0;
    for(int i=0;i<n;i++){
        if(Mr[i][i]!=1){
            printf("该关系不为等价关系");
            flag++;
        }
    }
    //判断关系是否对称
    if(flag==0){
      for(int i=0;i<n;i++){
         for(int j=i+1;j<n;j++){
             if(Mr[i][j]!=Mr[j][i]){
                printf("该关系不为等价关系");
                flag++;
            }
        }
      }
    }
    //判断关系是否传递
    if(flag==0){
       //将关系矩阵储存到新的二维数组里
       int B[n][n];
       for(int i=0;i<n;i++){
         for(int j=0;j<n;j++){
                B[i][j]=Mr[i][j];
        }

     }
    //求传递闭包
      for(int i=0;i<n;i++){
         for(int j=0;j<n;j++){
             for(int k=0;k<n;k++){
                 if(Mr[i][j]==1){
                    if(Mr[i][k]==0&&Mr[j][k]==0){
                        Mr[i][k]=0;
                    }
                    else
                        Mr[i][k]=1;
                 }
             }
         }
     }
    //判断关系是否传递
     for(int i=0;i<n;i++){
         for(int j=0;j<n;j++){
                if( B[i][j]!=Mr[i][j]){
                  printf("该关系不为等价关系");

                }
         }

     }
   }
   if(flag==0){
    printf("该关系为等价关系\n");
    printf("有如下等价类:\n");
    // 求等价类
    for(int i =0;i<n;i++){
        int M[6]={0,0,0,0,0,0};
        int x=0;
        for(int j=0;j<n;j++){
            if(Mr[i][j]==1){
                M[x]=j+1;
                x++;
            }
        }
        printf("M[%d]={",i+1);
        for(int k=0;k<=5;k++){
            if(M[k]!=0){
                printf("%d,",M[k]);
            }
        }
        printf("}\n");
    }

   }
    return 0;
}

最终得出以下结果

 

本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)

c语言实现等价关系的判断以及等价类的输出 的相关文章

随机推荐

  • 编译脚本(build.sh),执行脚本(start.sh),停止脚本(stop.sh)

    编写一个服务程序后 通过这三个脚本去编译 执行 停止 build sh脚本文件 bin bash 1 该行是如果出现错误 就退出脚本执行 set e 设置基本环境变量start export LC ALL en US UTF 8 1 BAS
  • Dockerfile、docker-compose、docker网络以及Portainer安装

    文章目录 1 安装mysql主从复制 2 安装redis集群 分布式存储案例 2 1 cluster 集群 模式 docker版 哈希取余分区 一致性哈希算法分区 哈希槽分区 2 2 3主3从redis集群配置 2 3 主从容错切换迁移 数
  • DeepBrainNet论文阅读笔记

    论文题目 MRI signatures of brain age and disease over the lifespan based on a deep brain network and 14 468 individuals worl
  • Caused by: java.lang.ClassNotFoundException: Didn’t find class on path apk Android Studio解决方案

    标签 android studio ClassNotFoundException library 尊重远程 转载请注明出处 http blog csdn net a740169405 article details 50351039 错误原
  • DC-DC自举电容(BOOT)几个问题

    在BUCK电路中 经常会看到一个电容连接在芯片的SW和boot管脚之间 这个电容称之为自举电容 关于这个电容 有以下几个问题 自举电容有什么用 以MPS的buck芯片MP1484为例 规格书中芯片的BS管脚说明如下 在BS和SW之间接一个0
  • 数字信号处理知识点

    数字信号处理知识点 1 频谱图中 横坐标取值范围的含义 2 MATLAB常用函数 2 1 波形产生 2 2 滤波器分析 2 3 滤波器实现 2 4 线性系统变换 2 5 滤波器设计 2 5 1 FIR滤波器 2 5 2 IIR滤波器 2 6
  • vue Cannot create property ‘xxx字段‘ on string

    看一下入参格式是否正确
  • const char *、char const*、char *const三者的区别

    一 const char 对于const char s来说 const char 是指向常量的指针 而不是指针本身为常量 可以不被初始化 该指针可以指向常量也可以指向变量 只是从该指针的角度而言 它所指向的是常量 s是不变的 s是可以改变的
  • git如何提交功能分支代码

    1 当你要写一个功能之前 先创建一个分支 在项目的终端输入 例如 git checkout b login 现在我们就创建了一个login登录分支 输入git branch 可以看到我们正处在login这个分支上面 2 当你写完这个登录功能
  • 数组越界访问会发生什么错误?怎样避免该错误?_SEGMENTATION FAULT IN LINUX 原因与避免...

    原作者 ZX WING xing5820 163 com 写得很好 加上之前的确遇到过很多信号问题 产生了很多疑问 1 什么是 Segmentation fault in Linux 我们引用wiki上的一段话来回答这个问题 A segme
  • vue 3.x 的生命周期函数与vue2的变化

    vue3 中取消了 beforeCreate与 created 这两个生命周期函数 其他的生命周期函数也发生了改变 图标中左侧是vue2中的名称 右侧是对应的vue3中的名称 beforeMount onBeforeMount mounte
  • Kibana介绍、安装和使用

    ELK中的K Kibana 下面就Kibana对ES的查询监控作介绍 就是常提到的大数据日志处理组件ELK里的K 什么是Kibana 现引用园友的一段对此的介绍 个人觉得比较全 Kibana是一个针对Elasticsearch的开源分析及可
  • Linux网络编程——TCP编程

    文章目录 前言 tcp编程相关函数 1 socket函数 2 bind函数 3 listen函数 4 accept函数 5 connect函数 6 send函数 7 recv函数 8 close函数 总结 前言 tcp编程的实现流程 tcp
  • IOException parsing XML document from class path resource [applicationContext.xml]

    今天在学习Spring框架时遇到了错误 经过报错分析发现是applicationContext xml文件位置放错了 在本地测试时 applicationContext xml文件应该放在src目录下 在服务端测试时放在WEB INF目录下
  • unity dll 位置

    在unityengine里面加 cs 然后在vs里面中看 C Program Files x86 Reference Assemblies Microsoft Framework NETFramework v3 5 Profile Unit
  • linux性能监控工具

    这本阿里P8撰写的算法笔记 再次推荐给大家 身边不少朋友学完这本书最后加入大厂 Github 疯传 史上最强悍 阿里大佬 LeetCode刷题手册 开放下载了 引言 对于系统和网络管理员来说每天监控和调试Linux系统的性能问题是一项繁重的
  • 虚拟机安装Kali Linux操作系统

    博主主站地址 微笑涛声 www cztcms cn Kali Linux是基于Debian的Linux发行版 设计用于数字取证操作系统 每一季度更新一次 由Offensive Security Ltd维护和资助 最先由Offensive S
  • 超详细!Win10(UEFI启动)安装Ubuntu18.04双系统

    UEFI模式 首先必须说明的是 有两种不同的启动模式 在安装双系统的时候的操作也不尽相同 本文是针对UEFI启动模式的安装双系统的成功案例 如果您的计算机的启动模式是Legacy 请参考其他文章 如何知道自己的电脑是哪种启动模式 找到 运行
  • VoiceChat使用心得:探索沟通的全新维度

    在数字时代 沟通方式的多样性为我们提供了更多选择 最近 我发现了一个令人兴奋的新工具 它让我重新审视了沟通的全新维度 VoiceChat 作为一个热衷于技术和交流的人 我迫不及待地想分享一下我的使用心得 VoiceChat是一种即时语音通话
  • c语言实现等价关系的判断以及等价类的输出

    原理 设X 1 2 3 n 关系R的关系矩阵是M mij 判断等价关系 1 R是自反的 lt gt m11 m22 mnn 1 2 R是对称的 lt gt lt gt mij mji 3 R是传递的 lt gt tr R R 求等价类 如果