试验二关系闭包计算

相关主题
  1. 1、下载文档前请自行甄别文档内容的完整性,平台不提供额外的编辑、内容补充、找答案等附加服务。
  2. 2、"仅部分预览"的文档,不可在线预览部分如存在完整性等问题,可反馈申请退款(可完整预览的文档不适用该条件!)。
  3. 3、如文档侵犯您的权益,请联系客服反馈,我们会尽快为您处理(人工客服工作时间:9:00-18:30)。

实验二关系闭包计算

学院:计算机科学与软件学院指导老师:石陆魁

班级:116班

姓名:薛捷星

学号:112547

一、实验目的

熟悉Warshall算法,掌握求关系的自反闭包、对称闭包和传递闭包的方法。

二、实验内容与要求

定义6 设R是A上的二元关系,R的自反(对称、传递)闭包是关系R1,则

①R1是自反的(对称的、传递的)

②R⊆R1

③对任何自反的(对称的、传递的)关系R2,若R⊆R2,则R1⊆R2。

R的自反、对称和传递闭包分别记为r(R)、s(R)和t(R)。

定理1 令R⊆A⨯A,则

①r(R)=R∪IA

②s(R)=R∪R-1

③t(R)=R∪R2∪R3…

Warshall算法:设R是n个元素集合上的二元关系,M是R的关系矩阵;

(1)置新矩阵A:=M

(2)置i:=1;

(3)for j=1 to n do

if A[j,i]=1 then do

for k=1 to n do

A[j,k]:=A[j,k]+A[i,k]

(4)i=i+1;

(5)if i<=n then to (3)

else stop

本实验要求从键盘输入一个关系的关系矩阵,计算其自反闭包、对称闭包和传递闭包,计算传递闭包时使用Warshall算法。用C语言或MA TLAB实现。

三、源程序

#include

#define n 4

main()

{

int i,j,k,a[n][n],I[n][n]={1,0,0,0,0,1,0,0,0,0,1,0,0,0,0,1},b[n][n],r[n][n];

printf("输入R的关系矩阵:\n");

for(i=0;i

{

for(j=0;j

{

scanf("%d",&a[i][j]);

}

}

for(j=0;j

{

for(k=0;k

{

b[j][k]=a[j][k];

}

}

printf("输出R的自反闭包矩阵:\n");

for(i=0;i

{

for(j=0;j

{

if(a[i][j]==1||I[i][j]==1)

r[i][j]=1;

else

r[i][j]=0;

printf("%4d",r[i][j]);

}

printf("\n");

}

printf("输出R的对称闭包矩阵:\n");

for(i=0;i

{

for(j=0;j

{

a[j][i]=a[i][j];

printf("%4d",a[i][j]);

}

printf("\n");

}

printf("输出R的传递闭包矩阵:\n");

i=0;

while(i

{

for(j=0;j

{

for(k=0;k

{

a[j][k]=b[j][k];

}

}

for(j=0;j

{

if (a[j][i]==1)

{

for(k=0 ;k

{

if(a[j][k]==1||a[i][k]==1)

b[j][k]=1;

else

b[j][k]=0;

}

}

else

continue;

}

i++;

}

for(j=0;j

{

for(k=0;k

{

printf("%4d",b[j][k]);

}

printf("\n");

}

}

四、实验结果

相关文档
最新文档