#include<stdio.h>
#include<string.h>
#define N 10
int p[N][N],u[N][N],r[N][N];
int e;
void jujia(int m[N][N],int n[N][N]){
int i,j;
for(i=0;i<e;i++)
for(j=0;j<e;j++){
p[i][j]=m[i][j]||n[i][j];
}
}
void juni(int m[N][N]){
int i,j,k;
for(i=0;i<e;i++)//求R的逆
for(k=0;k<=i;k++)
{
k=m[i][j];
m[i][j]=m[j][i];
m[j][i]=k;
}
}
void get_matrix(int a[N][N])
{
int i,j;
for (i = 0;i < e;i++)
for (j = 0;j < e;j++)
scanf("%d",&a[i][j]);
}
int output_matrix(int a[N][N])
{
int i,j;
for (i = 0;i < e;i++) {
for (j = 0;j < e;j++) {
printf("%d ",a[i][j]);
}
putchar('\n');
}
}
int warshall(int a[N][N])
{
int i,j,k;
for (i = 0;i < e;i++)
{
for (j = 0;j < e;j++)
{
if (a[j][i])
{
for (k = 0;k < e;k++)
{
a[j][k] = a[j][k]|a[i][k];//逻辑加
}
}
}
}
}
/***********主函数************/
int main(){
int i,j=0,k;
char m[30],c[10];
/************输入集合A***************/
printf("请输入集合A ( 必须以'}'结束 )\n");
scanf("%s",m);
for(i=0;i<50;i++){
if((m[i]!='{')&&(m[i]!=',')&&m[i]!='}')
{
c[j]=m[i];
j++;
}
if(m[i]=='}')break;
}
e=j; //用e记录集合A中元素个数
/*************输入R的关系矩阵*************/
printf("请输入关系矩阵,注意分空格。\n");
get_matrix(r);
/*************求R的自反闭包**************/
memcpy(u,r,sizeof(r)); //将矩阵r拷贝到矩阵u里
printf("R的自反闭包的矩阵为:\n");
for(i=0;i<e;i++)
u[i][i]=1;
output_matrix(u);
/*************求R的对称闭包*************/
memcpy(u,r,sizeof(r)); //将矩阵r拷贝到矩阵u里
juni(u); //求r的逆的矩阵
jujia(r,u);//将r的矩阵和r的逆的矩阵相加
printf("R的对称闭包的矩阵为:\n");
output_matrix(p);
/*************求R的传递闭包**************/
warshall(r);
printf("R的传递闭包的矩阵为:\n");
output_matrix(r);
}
#include<string.h>
#define N 10
int p[N][N],u[N][N],r[N][N];
int e;
void jujia(int m[N][N],int n[N][N]){
int i,j;
for(i=0;i<e;i++)
for(j=0;j<e;j++){
p[i][j]=m[i][j]||n[i][j];
}
}
void juni(int m[N][N]){
int i,j,k;
for(i=0;i<e;i++)//求R的逆
for(k=0;k<=i;k++)
{
k=m[i][j];
m[i][j]=m[j][i];
m[j][i]=k;
}
}
void get_matrix(int a[N][N])
{
int i,j;
for (i = 0;i < e;i++)
for (j = 0;j < e;j++)
scanf("%d",&a[i][j]);
}
int output_matrix(int a[N][N])
{
int i,j;
for (i = 0;i < e;i++) {
for (j = 0;j < e;j++) {
printf("%d ",a[i][j]);
}
putchar('\n');
}
}
int warshall(int a[N][N])
{
int i,j,k;
for (i = 0;i < e;i++)
{
for (j = 0;j < e;j++)
{
if (a[j][i])
{
for (k = 0;k < e;k++)
{
a[j][k] = a[j][k]|a[i][k];//逻辑加
}
}
}
}
}
/***********主函数************/
int main(){
int i,j=0,k;
char m[30],c[10];
/************输入集合A***************/
printf("请输入集合A ( 必须以'}'结束 )\n");
scanf("%s",m);
for(i=0;i<50;i++){
if((m[i]!='{')&&(m[i]!=',')&&m[i]!='}')
{
c[j]=m[i];
j++;
}
if(m[i]=='}')break;
}
e=j; //用e记录集合A中元素个数
/*************输入R的关系矩阵*************/
printf("请输入关系矩阵,注意分空格。\n");
get_matrix(r);
/*************求R的自反闭包**************/
memcpy(u,r,sizeof(r)); //将矩阵r拷贝到矩阵u里
printf("R的自反闭包的矩阵为:\n");
for(i=0;i<e;i++)
u[i][i]=1;
output_matrix(u);
/*************求R的对称闭包*************/
memcpy(u,r,sizeof(r)); //将矩阵r拷贝到矩阵u里
juni(u); //求r的逆的矩阵
jujia(r,u);//将r的矩阵和r的逆的矩阵相加
printf("R的对称闭包的矩阵为:\n");
output_matrix(p);
/*************求R的传递闭包**************/
warshall(r);
printf("R的传递闭包的矩阵为:\n");
output_matrix(r);
}