目录
一、原理
二、代码实现
三、运行结果
一、原理
在关系矩阵中,
自反闭包的主对角线元素全为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一下】
三、运行结果
欢迎分享,转载请注明来源:内存溢出
评论列表(0条)