试验二关系闭包计算
- 1、下载文档前请自行甄别文档内容的完整性,平台不提供额外的编辑、内容补充、找答案等附加服务。
- 2、"仅部分预览"的文档,不可在线预览部分如存在完整性等问题,可反馈申请退款(可完整预览的文档不适用该条件!)。
- 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"); } } 四、实验结果