请用C语言写出以下算法的代码:首先将任意关系通过关系矩阵表示,关系的自反闭包只需将矩阵的主对角线元素全部置为1;关系的对称闭包即关系矩阵与其转置矩阵进行加法运算(逻辑加);关系的传递闭包转化为矩阵的计算,计算公式为 Mt = M + M2 + M3 + …(逻辑加) 其中M为关系矩阵,Mt为传递闭包的矩阵。 关系的传递闭包也可用Floyd-Warshall算法计算,效率更高,Floyd-Warshall算法原理为: 设R的关系矩阵为n阶矩阵M,传递闭包矩阵为A = A[j, k], (1)令矩阵A = M
时间: 2024-04-03 21:36:35 浏览: 10
#include <stdio.h>
#define MAXSIZE 100
int main(){
int n, i, j, k;
int M[MAXSIZE][MAXSIZE], A[MAXSIZE][MAXSIZE];
printf("请输入关系矩阵的阶数n:");
scanf("%d", &n);
printf("请输入关系矩阵M:\n");
for(i = 0; i < n; i++){
for(j = 0; j < n; j++){
scanf("%d", &M[i][j]);
}
}
// 自反闭包
for(i = 0; i < n; i++){
M[i][i] = 1;
}
// 对称闭包
for(i = 0; i < n; i++){
for(j = 0; j < n; j++){
M[i][j] = M[i][j] || M[j][i];
}
}
// 传递闭包 - Floyd-Warshall算法
for(i = 0; i < n; i++){
for(j = 0; j < n; j++){
A[i][j] = M[i][j];
}
}
for(k = 0; k < n; k++){
for(i = 0; i < n; i++){
for(j = 0; j < n; j++){
A[i][j] = A[i][j] || (A[i][k] && A[k][j]);
}
}
}
printf("自反闭包:\n");
for(i = 0; i < n; i++){
for(j = 0; j < n; j++){
printf("%d ", M[i][j]);
}
printf("\n");
}
printf("对称闭包:\n");
for(i = 0; i < n; i++){
for(j = 0; j < n; j++){
printf("%d ", M[i][j]);
}
printf("\n");
}
printf("传递闭包:\n");
for(i = 0; i < n; i++){
for(j = 0; j < n; j++){
printf("%d ", A[i][j]);
}
printf("\n");
}
return 0;
}