离散数学关系的闭包运算
- 1、下载文档前请自行甄别文档内容的完整性,平台不提供额外的编辑、内容补充、找答案等附加服务。
- 2、"仅部分预览"的文档,不可在线预览部分如存在完整性等问题,可反馈申请退款(可完整预览的文档不适用该条件!)。
- 3、如文档侵犯您的权益,请联系客服反馈,我们会尽快为您处理(人工客服工作时间:9:00-18:30)。
《离散数学》
实验报告
学院软件学院
专业软件工程
指导教师邹丽娜
学号10008118
姓名冯立勇
提交日期2011-12-25
实验二关系的闭包运算
一 、实验目的
熟悉关系的闭包运算,编程实现关系闭包运算算法。
一 、实验内容
利用矩阵求解有限集上给定关系的自反、对称和传递闭包。
三. 实验过程
1. 算法分析:
在三种闭包中自反和对称闭包的求解很容易,对矩阵表示的关系,其自反闭包只要将矩阵的主对角线全部置为1就可;对称闭包则加上关系的转置矩阵(逻辑加法);传递闭包则有两种算法(二选一即可):
算法1:直接根据 n i i R
R t 1)(==计算,过程略。
算法2:Warshall 算法(1962)
设R 的关系矩阵为M
(1)令矩阵A=M
(2)置i=1
(3)对所有的j ,若A[j ,i]=1,则
对于 k=1,2,…,n ,令A[j ,k]=A[j ,k]+A[i ,k]
注:此处为逻辑加,可以使用运算符||
(4) i=i+l .
(5)若i ≤n ,则转到(3),否则结束.
流程图
开始
声明各子函数
输入关系矩阵
输入z
z=1;调用自反闭包函数 z=2,调用对称闭包函数 z=3调用传递闭包函数
2. 程序代码:
#include
void output(int s[][100]);
void zifan(int s2[][100]);
void duichen(int s2[][100]);
void chuandi2(int s2[][100]);
void chuandi1(int s2[][100]);
void aa();
int s[100][100],z;
int d,n ,i,j;
int main(){aa();return 0;}
void aa()
{
printf("请输入矩阵的行数(必须小于10)\n ");
scanf("%d",&n);
printf("请输入矩阵的列数(必须小于10)\n ");
scanf("%d",&d);
printf("请输入关系矩阵\n");
for(i=0;i { printf("\n"); printf("请输入矩阵的第%d行元素",i); for(j=0;j scanf("%d",&s[i][j]); } printf("输入对应序号选择算法\n1:自反闭包\n2:传递闭包1\n3:传递闭包(Warhall算法)2\n4:对称闭包\n"); scanf("%d",&z); switch(z) { case 1:zifan(s); break; case 2:chuandi1(s);break; case 3:chuandi2(s);break; case 4:duichen(s); break; } } void output(int s[][100]) {printf("所求关系矩阵为\n"); for(i=0;i {for(j=0;j printf("%d",s[i][j]); printf("\n"); } } void zifan(int s2[][100]) { for(i=0;i s2[i][i]=1; output(s2);aa(); } void duichen(int s2[][100]) {int s1[100][100]; for(i=0;i for(j=0;j s1[j][i]=s2[i][j]; for(i=0;i for(j=0;j {s2[i][j]=s2[i][j]+s1[i][j]; if(s2[i][j]>1) s2[i][j]=1; } output(s2); aa(); } void chuandi1(int s2[][100]) {int m[100][100],a[100][100],k,h; int t[100][100]; for(i=0;i for(j=0;j { a[i][j]=0; t[i][j]=s2[i][j]; m[i][j]=s2[i][j];} for(h=0;h {for(i=0;i for(j=0;j if(m[i][j]==1) {for(k=0;k if(s2[j][k]==1) a[i][k]=1; } for(i=0;i for(j=0;j { m[i][j]=a[i][j]; t[i][j]+=a[i][j]; a[i][j]=0; if(t[i][j]>1) t[i][j]=1; } } output(t);aa(); } void chuandi2(int s2[][100]) {int k; for(i=0;i for(j=0;j if(s2[j][i]==1) for(k=0;k for(i=0;i for(j=0;j if(s2[i][j]>1) s2[i][j]=1; output(s2);aa();