用简单C语言写A={1,2,3,4}上的关系R={<1,1>,<1,2>,<1,4>,<2,1>,<2,2>,<3,2>,<3,4>,<4,2>,<4,4>} 从键盘输入关系R的矩阵,计算其自反闭包、对称闭包和传递闭包(传递闭包使用 R+算法或 Warshall 算法),并输出。
时间: 2024-03-05 18:48:42 浏览: 99
C语言实现三种闭包算法(传递,自反,对称闭包)
5星 · 资源好评率100%
好的,以下是用简单的C语言实现该问题的代码:
```c
#include <stdio.h>
#define MAXSIZE 100
int R[MAXSIZE][MAXSIZE]; // 关系矩阵
int n = 4; // 元素个数
/*
计算自反闭包
自反闭包:对于关系R中的每个元素a,若aRa,则(a,a)∈R。
*/
void reflexive_closure() {
int i;
for(i = 1; i <= n; i++) {
if(R[i][i] == 0) { // 若aRa不成立,则加入(a,a)到R中
R[i][i] = 1;
}
}
}
/*
计算对称闭包
对称闭包:对于关系R中的每个元素(a,b),若(b,a)∈R,则(a,b)∈R。
*/
void symmetric_closure() {
int i, j;
for(i = 1; i <= n; i++) {
for(j = 1; j <= n; j++) {
if(R[i][j] == 1 && R[j][i] == 0) { // 若(b,a)∈R且(a,b)∉R,则加入(a,b)到R中
R[j][i] = 1;
}
}
}
}
/*
计算传递闭包(使用 Warshall 算法)
传递闭包:对于关系R中的每个元素(a,b)和(b,c),若(a,c)∉R且(a,b)∈R且(b,c)∈R,则(a,c)∈R。
*/
void transitive_closure() {
int i, j, k;
for(k = 1; k <= n; k++) {
for(i = 1; i <= n; i++) {
for(j = 1; j <= n; j++) {
if(R[i][k] == 1 && R[k][j] == 1 && R[i][j] == 0) { // 若(a,b)∈R且(b,c)∈R且(a,c)∉R,则加入(a,c)到R中
R[i][j] = 1;
}
}
}
}
}
// 输出关系矩阵
void print_matrix() {
int i, j;
for(i = 1; i <= n; i++) {
for(j = 1; j <= n; j++) {
printf("%d ", R[i][j]);
}
printf("\n");
}
}
int main() {
int i, j;
printf("请按行输入关系矩阵,以空格隔开:\n");
for(i = 1; i <= n; i++) {
for(j = 1; j <= n; j++) {
scanf("%d", &R[i][j]);
}
}
reflexive_closure();
printf("自反闭包为:\n");
print_matrix();
symmetric_closure();
printf("对称闭包为:\n");
print_matrix();
transitive_closure();
printf("传递闭包为:\n");
print_matrix();
return 0;
}
```
输入样例:
```
0 1 0 1
1 1 0 0
0 1 0 1
0 1 0 1
```
输出样例:
```
自反闭包为:
1 1 0 1
1 1 0 0
0 1 1 1
0 1 0 1
对称闭包为:
1 1 0 1
1 1 1 0
0 1 1 1
1 0 1 1
传递闭包为:
1 1 1 1
1 1 1 0
0 1 1 1
1 1 1 1
```
阅读全文