用简单C语言实现输入关系R的矩阵,计算其自反闭包、对称闭包和传递闭包( Warshall 算法),并输出。
时间: 2024-03-05 21:49:45 浏览: 19
好的,我会尽力回答你的问题。以下是用C语言实现输入关系R的矩阵,计算其自反闭包、对称闭包和传递闭包(Warshall算法)的代码:
```c
#include<stdio.h>
#define MAXSIZE 10
void input(int arr[][MAXSIZE], int n); // 输入矩阵
void output(int arr[][MAXSIZE], int n); // 输出矩阵
void reflexive_closure(int arr[][MAXSIZE], int n); // 计算自反闭包
void symmetric_closure(int arr[][MAXSIZE], int n); // 计算对称闭包
void transitive_closure(int arr[][MAXSIZE], int n); // 计算传递闭包
int main()
{
int arr[MAXSIZE][MAXSIZE], n;
printf("请输入矩阵大小n(n<=10):");
scanf("%d", &n);
printf("请输入关系R的矩阵:\n");
input(arr, n);
printf("\n关系R的矩阵为:\n");
output(arr, n);
reflexive_closure(arr, n);
printf("\n自反闭包为:\n");
output(arr, n);
symmetric_closure(arr, n);
printf("\n对称闭包为:\n");
output(arr, n);
transitive_closure(arr, n);
printf("\n传递闭包为:\n");
output(arr, n);
return 0;
}
void input(int arr[][MAXSIZE], int n)
{
int i, j;
for(i=0; i<n; i++)
{
for(j=0; j<n; j++)
{
scanf("%d", &arr[i][j]);
}
}
}
void output(int arr[][MAXSIZE], int n)
{
int i, j;
for(i=0; i<n; i++)
{
for(j=0; j<n; j++)
{
printf("%d ", arr[i][j]);
}
printf("\n");
}
}
void reflexive_closure(int arr[][MAXSIZE], int n)
{
int i;
for(i=0; i<n; i++)
{
arr[i][i] = 1;
}
}
void symmetric_closure(int arr[][MAXSIZE], int n)
{
int i, j;
for(i=0; i<n; i++)
{
for(j=i+1; j<n; j++)
{
if(arr[i][j] == 1)
{
arr[j][i] = 1;
}
else if(arr[j][i] == 1)
{
arr[i][j] = 1;
}
}
}
}
void transitive_closure(int arr[][MAXSIZE], int n)
{
int i, j, k;
for(k=0; k<n; k++)
{
for(i=0; i<n; i++)
{
for(j=0; j<n; j++)
{
arr[i][j] = arr[i][j] || (arr[i][k] && arr[k][j]);
}
}
}
}
```
希望这个代码可以帮到你!