怎么在c语言中判断矩阵的主对角线下面的元素为0?_《离散数学》中三种闭包的简单计算机实现(c++)...

说在前面:

1、本帖的三个算法全部采用关系(布尔)矩阵实现,也有大佬用STL模板库中的set和vector实现了,本人学完STL之后会补充set和vector的实现方法。

2、本帖采用组数据输入,如果要求“组输入数据”,请将:

while(cin>>n)

改为:

cin>>n;

3、本帖算法采用memset函数赋初值,如果不了解memset的使用方法的话,可以参考:memset()函数及其作用_网络_monk1992的博客-CSDN博客

注:版权归属原作者,侵删

4、对于没有学过c++的朋友们,可以将cin、cout分别改成scanf、printf。

5、每一个算法仅提供一组样例。

6、算法不一定绝对正确,欢迎各位朋友前来hack。

7、对本帖中算法输入形式的说明:

第一行是一个正整数n,表示集合A的元素个数,即A={1,2,3,···,n}(n小于等于20)。

第二行是一个正整数m(0<m≤n*n),表示关系R中二元组的个数。

接下去是m行,每行有两个整数a和b,表示二元组<a,b>∈R。

----------------------------------------------------

以下是算法具体内容及解析。

5.19第一次更新,更改了变量名以及部分不恰当的定义。

----------------------------------------------------

一、自反闭包

自反闭包的矩阵运算规则:

关系 R 是自反的当且仅当 R 的关系矩阵的主对角线上全为 1.

题解:

签到题难度,都不用判断,令主对角线上全为1,然后输出是1的元素即可.

以下为完整代码:

#include

----------------------------------------------------

二、对称闭包

对称闭包的矩阵运算规则:

关系 R 是对称的当且仅当 R 的关系矩阵 (rij)n×n 为对称矩阵, 即r[i][j]=r[j][i].

题解:

只要理清了规则就很好理解,因为两个对称元素必然都是相同的值,那么对于两个不同的元素而言,直接将他们全部赋为相同的值就ok了.

关键行(伪)代码为:

{
      

以下是完整代码:

#include

----------------------------------------------------

三、传递闭包

传递闭包的矩阵运算规则:

关系 R 是传递的当且仅当在 R 的关系矩阵中, 对任意 i,j,k∈{1,2,··· ,n},若 rij = 1 且 rjk = 1,必有 rik = 1.

题解:

设有一个布尔矩阵M是R的关系矩阵,可以对两个布尔矩阵做矩阵乘法,如果M中的a[i][j]=0,必然会对应有M*M的b[i][j]=0.

也就是说,在a[i][j]=0且b[i][j]!=0的情况下,要满足传递性,只能令a[i][j]=1。即求得了传递闭包。

所以可以想到对M做乘法(当年上课都教考研题的线性代数终于派上了用场),关键行(伪)代码为:

{
      

但是注意,此时需要连续计算两次,因为第一次只是填充了新的元素进去,而新的元素有可能构成新的传递闭包,所以需要连续判断两次。

以下是完整代码:

#include

以上。

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值