求关系的闭包

#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);
}
  • 1
    点赞
  • 5
    收藏
    觉得还不错? 一键收藏
  • 打赏
    打赏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

在月光下弹琴

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值