用c语言求二元关系R= {<a,a>,<a,b>,<b,a>,<b,c>,<c,b>,<d,d>}的三种闭包,要求传递闭包用warshall方法。给出代码
时间: 2023-06-06 20:04:20 浏览: 128
利用Warshall算法求二元关系的可传递闭包.docx
可以用以下代码实现:
#include <stdio.h>
#define MAX_SIZE 100
int n; //元素个数
int r[MAX_SIZE][MAX_SIZE]; //关系矩阵
int trans_closure[MAX_SIZE][MAX_SIZE]; //传递闭包
//求自反闭包
void reflexivity(){
for(int i=0;i<n;i++){
r[i][i] = 1;
}
}
//求对称闭包
void symmetry(){
for(int i=0;i<n;i++){
for(int j=0;j<n;j++){
if(r[i][j] == 1){
r[j][i] = 1;
}
}
}
}
//求传递闭包
void transitivity(){
for(int k=0;k<n;k++){
for(int i=0;i<n;i++){
for(int j=0;j<n;j++){
if(r[i][j] == 1 || (r[i][k] == 1 && r[k][j] == 1)){
trans_closure[i][j] = 1;
}
}
}
//将求得的传递闭包赋值给关系矩阵
for(int i=0;i<n;i++){
for(int j=0;j<n;j++){
r[i][j] = trans_closure[i][j];
}
}
}
}
int main() {
n = 4; //元素个数
//初始化关系矩阵
r[0][0] = 1;
r[0][1] = 1;
r[1][0] = 1;
r[1][2] = 1;
r[2][1] = 1;
r[3][3] = 1;
//求自反闭包
reflexivity();
//求对称闭包
symmetry();
//求传递闭包(使用warshall方法)
transitivity();
//输出传递闭包
printf("The transitive closure is:\n");
for(int i=0;i<n;i++){
for(int j=0;j<n;j++){
printf("%d ", trans_closure[i][j]);
}
printf("\n");
}
return 0;
}
阅读全文