离散数学:用python实现关系闭包的计算,即自反、对称与传递

目录

一、原理

二、代码实现

三、运行结果


一、原理

在关系矩阵中,

自反闭包的主对角线元素全为1;

对称闭包的元素关于主对角线对称;

传递闭包使用warshall算法【离散数学(第2版)-屈婉玲等著   P129见详解】

二、代码实现

import copy

L = []  # 建立空列表存放即将输入的矩阵
order = int(input())  # 输入矩阵的阶数

for i in range(order):
    nums = list(map(int, input().split()))
    L.append(nums)  # 依次输入每行的数字 把矩阵形成二维列表 L[0]表示该矩阵第一行的数字

def l_add(a, b):   # 逻辑加
    if a == 0 and b == 0:
        return 0
    else:
        return 1
def res_r(L):   # 自反闭包
    res_r = copy.deepcopy(L)
    for i in range(order):
        for j in range(order):
            if i == j:
                res_r[i][j] = 1
    for i in res_r:
        for j in i:
            print(j, end=' ')
        print()
def res_s(L):   # 对称闭包
    res_s = copy.deepcopy(L)
    for i in range(order):
        for j in range(order):
            if res_s[i][j] == 1:
                res_s[j][i] = 1
    for i in res_s:
        for j in i:
            print(j, end=' ')
        print()
def res_t(L):   # 传递闭包-warshall算法
    res_t = copy.deepcopy(L)
    for j in range(order):
        for i in range(order):
            if int(res_t[i][j]) == 1:
                for k in range(order):
                    res_t[i][k] = l_add(int(res_t[i][k]), int(res_t[j][k]))
    for i in res_t:
        for j in i:
            print(j, end=' ')
        print()

print("r(R):")
res_r(L)
print("s(R):")
res_s(L)
print("t(R):")
res_t(L)

注:

将一个列表赋值给另一个空列表,

在本代码中使用 list2 = list1[:] 或 list2=list1.copy() 在后续运算中均会改变原列表元素,

经查阅资料得,涉及到浅拷贝与深拷贝

本次代码使用了深拷贝,即 list2 = copy.deepcopy(list1)【需要import一下】

三、运行结果

 

 

  • 9
    点赞
  • 49
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值