离散数学二元关系传递性判别、闭包方法实验报告
传递闭包实验报告

一、实验目的1. 理解传递闭包的概念及其在图论中的应用。
2. 掌握利用Floyd-Warshall算法求解传递闭包的方法。
3. 通过编程实现传递闭包的计算,验证算法的正确性。
4. 分析实验结果,加深对传递闭包性质的理解。
二、实验原理传递闭包是指在给定集合X上的二元关系R,找到一个最小的传递关系R,使得对于任意的x, y, z∈X,若xRy且yRz,则xRz成立。
传递闭包可以用来描述图中节点之间的可达性,是图论中一个重要的概念。
Floyd-Warshall算法是一种求解传递闭包的经典算法,它通过构建一个n×n的邻接矩阵A,其中A[i][j]表示节点i到节点j的可达性。
算法的基本思想是:逐步更新矩阵A,使得A[i][j]的值表示节点i到节点j的最短路径可达性。
三、实验内容1. 设计一个图,包括节点和边,并构建相应的邻接矩阵。
2. 利用Floyd-Warshall算法计算邻接矩阵的传递闭包。
3. 分析传递闭包的结果,验证算法的正确性。
4. 对比不同图结构下的传递闭包计算结果,探讨传递闭包的性质。
四、实验步骤1. 设计一个图,包括5个节点和6条边,如下所示:```1 -- 2| || |3 -- 4| || |5 -- 6```2. 构建邻接矩阵A,如下所示:```| 1 2 3 4 5 6 |1| 0 1 0 0 0 0 |2| 0 0 1 0 0 0 |3| 0 0 0 1 0 0 |4| 0 0 0 0 1 0 |5| 0 0 0 0 0 1 |6| 0 0 0 0 0 0 |```3. 编写Floyd-Warshall算法的代码,计算传递闭包。
```pythondef floyd_warshall(adj_matrix):n = len(adj_matrix)for k in range(n):for i in range(n):for j in range(n):if adj_matrix[i][j] > adj_matrix[i][k] + adj_matrix[k][j]:adj_matrix[i][j] = adj_matrix[i][k] + adj_matrix[k][j]return adj_matrix# 初始化邻接矩阵adj_matrix = [[0, 1, 0, 0, 0, 0],[0, 0, 1, 0, 0, 0],[0, 0, 0, 1, 0, 0],[0, 0, 0, 0, 1, 0],[0, 0, 0, 0, 0, 1],[0, 0, 0, 0, 0, 0]]# 计算传递闭包transitive_closure = floyd_warshall(adj_matrix) print(transitive_closure)```4. 分析传递闭包的结果,验证算法的正确性。
离散数学实验报告1

《离散数学》课程设计学院软件学院学生姓名孟庆汉学号 0843042109 年级2008 指导教师冯伟森评阅意见提交日期2009 年12 月25 日《利用Warshall算法求二元关系的可传递闭包》学生:孟庆汉指导老师:冯伟森摘要:当集合的阶数n较大时,求二元关系的可传递闭包的工作量是相当庞大的。
幸运的是1962年S.Warshall提出了一个计算R+的有效方法,可在计算机上编程实现。
采用C语言函数写出这个算法。
程序中用m[i][j]表示关系矩阵M R的第i行第j列元素,用||表示逻辑或计算。
计算R+的函数名为Warshall,它的两个形式参数m和n分别表示关系矩阵M和矩阵的行数。
函数的实现实际上是一个三重循环构成。
关键字:二元关系关系矩阵可传递闭包Warshall算法三重循环引言《离散数学》是现代数学的一个重要分支,也是计算机科学与技术,电子信息技术,生物技术等的核心基础课程。
二元关系是离散数学中重要的内容。
世界上的事物都在一定范围内以某种方式互相联系,例如天体之间可以用的是同一星系来划分,人们之间可以用是否有共同的祖先来定血缘。
类似的数学或者计算机科学中的研究对象也以各种不同的形式相互联系着,例如整数之间以大小,整除或同余等关系相互连接着,命题公式之间以是否有相同的主合取范式相联系,程序中两个变量可以用是否占有同一内存地址相联系。
总之,事物之间总是可以根据需要确定相应的关系。
从数学的角度来看,这类联系就是某个集合中元素之间存在的关系。
一个二元关系可能具有某种性质,也可能不具有这种性质。
关系的闭包就是使一个二元关系变成具有指定性质的关系,并且还要满足最小性的条件。
数学原理设A和B都是已知的集合,R是A到B的一个确定的二元关系,那么集合R就是A×B的一个合于R={(x,y)∈A×B|xRy}的子集合设R是集合A上的二元关系:a.对任意的x∈A,都满足<x,x>∈R,则称R是自反的,或称R具有自反性,即R在A上是自反的⇔(∀x)((x∈A)→(<x,x>∈R))=1b.对任意的x,y∈A,如果<x,y>∈R,那么<y,x>∈R,则称关系R是对称的,或称R 具有对称性,即R在A上是对称的⇔ (∀x)(∀y)((x∈A)∧(y∈A)∧(<x,y>∈R)→(<y,x>∈R))=1c.对任意的x,y,z∈A,如果<x,y>∈R且<y,z>∈R,那么<x,z>∈R,则称关系R是传递的,或称R具有传递性,即R在A上是传递的⇔ (∀x)(∀y)(∀z)[(x∈A)∧(y∈A)∧(z∈A)∧((<x,y>∈R)∧(<y,z>∈R)→(<x,z>∈R))]=1设R是定义在A上的二元关系,若存在A上的关系R′满足:1)R′是自反的(或对称的、或可传递的),2)R⊆ R′,3)对A上任何其它满足1)和2)的关系R〞,都有:R′⊆ R〞。
闭包运算的实验报告

一、实验目的1. 理解闭包运算的概念及其在离散数学中的应用。
2. 掌握关系闭包运算(自反闭包、对称闭包、传递闭包)的求解方法。
3. 利用编程语言实现关系闭包运算,并分析实验结果。
二、实验内容1. 自反闭包运算:给定一个关系R,求出R的自反闭包R^。
2. 对称闭包运算:给定一个关系R,求出R的对称闭包R^s。
3. 传递闭包运算:给定一个关系R,求出R的传递闭包R^t。
三、实验环境1. 操作系统:Windows 102. 编程语言:Python3.73. 开发工具:PyCharm四、实验步骤1. 定义关系R:以矩阵形式表示关系R,其中R[i][j]表示元素i和元素j之间的关系,1表示存在关系,0表示不存在关系。
2. 求自反闭包R^:a. 初始化一个与R同样大小的矩阵R^。
b. 遍历R^,对于每个元素R^[i][j],若R[i][j]=1或i=j,则R^[i][j]=1。
3. 求对称闭包R^s:a. 初始化一个与R同样大小的矩阵R^s。
b. 遍历R,对于每个元素R[i][j],若R[i][j]=1,则R^[i][j]=1且R^[j][i]=1。
c. 遍历R^s,对于每个元素R^[i][j],若R^[i][j]=1,则R^[j][i]=1。
4. 求传递闭包R^t:a. 初始化一个与R同样大小的矩阵R^t。
b. 遍历R,对于每个元素R[i][j],若R[i][j]=1,则R^[i][j]=1。
c. 循环执行以下步骤,直到R^t不再变化:i. 遍历R^t,对于每个元素R^[i][j],若R^[i][k]=1且R^[k][j]=1,则R^[i][j]=1。
五、实验结果与分析1. 自反闭包运算:给定关系R如下:0 1 01 0 10 1 0求自反闭包R^,结果如下:1 1 11 1 11 1 12. 对称闭包运算:给定关系R如下:0 1 01 0 10 1 0求对称闭包R^s,结果如下:1 1 11 1 11 1 13. 传递闭包运算:给定关系R如下:0 1 01 0 10 1 0求传递闭包R^t,结果如下:1 1 11 1 11 1 1通过实验,我们可以发现:1. 自反闭包运算使得关系R中的所有元素都与自身存在关系。
《离散数学》中二元关系传递性的判定

《离散数学》中二元关系传递性的判定离散数学是一门研究离散结构的数学学科,而二元关系是离散数学中一个重要的概念。
在离散数学中,我们经常需要对二元关系进行判定,其中最为重要的性质之一就是传递性。
本文将围绕《离散数学》中二元关系传递性的判定展开讨论。
让我们来了解一下什么是二元关系。
在集合论中,如果给定一个集合A,那么A的二元关系R可以定义为A中元素之间的某种关系。
具体来说,对于任意的a、b∈A,如果(a, b)∈R,那么称a与b有关系R。
二元关系可以用有向图来表示,其中A中的元素对应图中的结点,而关系R中的元素对应图中的边。
为了简化描述,我们暂时不考虑关系R的性质,而只讨论关系R中元素的组成部分。
对于集合A={1,2,3,4},我们可以定义一个二元关系R={(1,2),(2,3),(3,4),(4,1)}。
这样,我们就得到了一个有向图来表示关系R,如下图所示:[图一]在这个有向图中,结点1和结点2之间有一条有向边,表示(1,2)∈R;结点2和结点3之间也有一条有向边,表示(2,3)∈R;依此类推。
很显然,通过有向图可以直观地看出集合A中元素之间的关系。
那么,关系R中的元素有哪些性质呢?在这里我们先介绍关系R的一条重要性质:传递性。
传递性是指如果对于任意的a、b、c∈A,如果(a, b)∈R且(b, c)∈R,那么(a,c)∈R。
直观地说,如果关系R中存在一条从a到b的有向边,同时存在一条从b到c的有向边,那么就应该存在一条从a到c的有向边。
下面我们将讨论如何判定关系R中的传递性。
对于关系R中的传递性,常用的方法是直接检验。
我们可以利用集合A中元素之间的关系,通过逐对比较来判断关系R是否满足传递性。
下面我们以一个具体的例子来说明。
考虑集合A={1,2,3,4},定义二元关系R={(1,2),(2,3),(3,4),(4,1)}。
为了判断关系R是否传递,我们需要逐对比较关系R中的元素。
我们找到所有满足(a, b)∈R和(b, c)∈R 的元组,然后检查是否存在(a, c)∈R。
《离散数学》中二元关系传递性的判定

《离散数学》中二元关系传递性的判定
在离散数学中,二元关系是指一个关联两个元素的集合。
传递性是二元关系的一个重要性质。
传递性是指如果某个关系中的元素a与另外两个元素b和c之间有关联,而且b 与c之间也有关联,那么就可以推断出a与c之间也有关联。
传递性的判定方法有多种,下面我们将介绍两种常用的判定方法。
一、图形法
图形法是通过绘制一个关系的有向图,并判断图中是否存在从一个元素到另一个元素的路径来判定传递性。
具体操作步骤如下:
1. 绘制有向图:将关系中的元素表示为图中的结点,关系表示为有向边。
根据关系定义,确定图中的结点以及结点之间的有向边。
2. 找到路径:从一个元素出发,通过有向边找到与它关联的所有元素,然后再通过有向边找到这些元素关联的所有元素,一直继续下去,直到找不到新的元素为止。
3. 判断传递性:如果从一个元素出发,可以找到与之存在关联的所有元素,那么就说明关系是传递的。
二、矩阵法
矩阵法是将一个关系表示为一个方阵,通过矩阵的乘法运算来判定传递性。
1. 构建矩阵:将关系中的元素表示为矩阵的行和列,关系的存在与否表示为矩阵元素的值。
如果元素a与元素b之间存在关系,那么矩阵的第a行第b列的值为1,否则为0。
2. 矩阵乘法:将矩阵与自身进行乘法运算,得到的结果是一个新的矩阵。
这两种判定传递性的方法都比较简单直观,可以根据具体情况选择适用的方法。
在实际应用中,传递性的判定常常与其他性质一起使用,以提供更准确的判断结果。
离散数学试验报告

学院理学院学生姓名 xxx学号 xxxxxxxxxxx实验:编程二元关系的传递性判别,二元关系闭包方法一.前言引语:二元关系是离散数学中重要的内容。
因为事物之间总是可以根据需要确定相应的关系。
从数学的角度来看,这类联系就是某个集合中元素之间存在的关系。
二.数学原理:1.传递关系:对任意的x,y,z∈A,如果<x,y>∈R且<y,z>∈R,那么<x,z>∈R,则称关系R是传递的,或称R具有传递性,即R在A上是传递的⇔ (∀x)(∀y)(∀z)[(x ∈A)∧(y∈A)∧(z∈A)∧((<x,y>∈R)∧(<y,z>∈R)→(<x,z>∈R))]=12.自反闭包、对称闭包、传递闭包:设R是定义在A上的二元关系,若存在A 上的关系R′满足:1)R′是自反的(或对称的、或可传递的),2)R⊆ R′,3)对A上任何其它满足1)和2)的关系R〞,都有:R′⊆R〞。
则称R′为R的自反闭包(或对称闭包、或传递闭包),分别记为r(R)、(s(R)和t(R))。
三.实验编程语言:c++四.实验程序源代码:#include<iostream>using namespace std;int cdx(int a[100][100],int n){int b[100][100],i,j;for(i=1;i<=n-1;i++){for(j=1;j<=n;j++){if(a[1][j]==a[i+1][j] && a[1][j]==0)b[i][j]=0;elseb[i][j]=1;}for(j=1;j<=n;j++){if(b[i][j]!=a[1][j])return 0;}}return 1;}void zfbb(int a[100][100],int n){int i,j;for(j=1;j<=n;j++){for(i=1;i<=n;i++){if(a[i][j]==1){a[i][i]=1;a[j][j]=1;}}}cout<<"自Á?反¤¡ä闭À?包㨹关?系¦Ì矩?阵¨®为a:êo"<<endl;for(i=1;i<=n;i++){for(j=1;j<=n;j++){if(a[i][j]>1){a[i][j]=1;cout<<a[i][j]<<" ";}else{cout<<a[i][j]<<" ";}}cout<<""<<endl;}}void dcbb(int a[100][100],int n){int i,j;for(j=1;j<=n;j++){for(i=1;i<=n;i++){if(a[i][j]==1){a[j][i]=1;}}}cout<<"对?称?闭À?包㨹关?系¦Ì矩?阵¨®为a:êo"<<endl;for(i=1;i<=n;i++){for(j=1;j<=n;j++){if(a[i][j]>1){a[i][j]=1;cout<<a[i][j]<<" ";}else{cout<<a[i][j]<<" ";}}cout<<""<<endl;}}void cdbb(int a[100][100],int n){int i,j,k;for(j=1;j<=n;j++){for(i=1;i<=n;i++){if(a[i][j]==1){for(k=1;k<=n;k++){a[i][k]=a[i][k]+a[j][k];}}}}cout<<"传ä?递ÌY闭À?包㨹关?系¦Ì矩?阵¨®为a:êo"<<endl;for(i=1;i<=n;i++){for(j=1;j<=n;j++){if(a[i][j]>1){a[i][j]=1;cout<<a[i][j]<<" ";}else{cout<<a[i][j]<<" ";}}cout<<""<<endl;}}void main(){int i,j,n,a[100][100],sel,ins;cout<<"请?输º?入¨?二t元a关?系¦Ì矩?阵¨®维?数ºyn"<<endl;cin>>n;cout<<"请?按ã¡äa[1,1],a[1,2]...a[1,n],a[2,1]...a[n.n]的Ì?顺3序¨©输º?入¨?关?系¦Ì矩?阵¨®的Ì?元a素?值¦Ì(ê¡§0,ê?1)ê?"<<endl;for(i=1;i<=n;i++)for(j=1;j<=n;j++){cin>>a[i][j];}INDEX:cout<<"请?输º?入¨?要©a判D定¡§的Ì?性?质¨º:êo"<<endl;cout<<"1、¡é传ä?递ÌY性?"<<endl;cout<<"2、¡é自Á?反¤¡ä闭À?包㨹"<<endl;cout<<"3、¡é对?称?闭À?包㨹"<<endl;cout<<"4、¡é传ä?递ÌY闭À?包㨹"<<endl;cout<<"5、¡é退ª?出?"<<endl;cin>>sel;if(sel==1){ins=cdx(a,n);if(ins==0)cout<<"该?二t元a关?系¦Ì不?具?有®D传ä?递ÌY性?。
实验一 传递闭包的实现(离散数学实验报告)

实验一传递闭包算法一、实验目的1、理解关系矩阵作为布尔矩阵的逻辑运算2、通过编程深刻理解Warshall快速算法3、验证Warshall快速算法的正确性4、掌握C语言的编程技巧和方法二、实验内容用C语言编程实现传递闭包的Warshall快速算法三、实验原理(Warshall算法的原理)M[i,j]表示关系R的关系矩阵M中元素若在关系R的关系图中存在从v i到v j的有向路径,则M[i,j]=1;否则M[i,j]=0。
定义:M k[i,j]=1 若在关系R的关系图中存在从v i到v j的有向路径,且这条路上除了v1,v2,┉,v k外没有其它节点否则M[i,j]=0即M0[i,j]=1⇔在关系R的关系图中存在从v i到v j的有向边M1[i,j]=1⇔在关系R的关系图中存在从v i到v j的有向路径,且这条路上除了可能有v1外没有其它节点M2[i,j]=1⇔在关系R的关系图中存在从v i到v j的有向路径,且这条路上除了可能有v1,v2外没有其它节点┉┉┉根据此定义,仅当下列两情形之一发生时,M k[i,j]=1(1)存在从v i到v j的有向路径,且这条路上除了可能有v1,v2,┉,v k-1外没有其它节点。
因此M k-1[i,j]=1(2)存在从v i到v k的有向路径和从v k到vj的有向路径,且每条路上除了可能有v1,v2,┉,v k-1外没有其它节点。
因此M k-1[i,k]=1 且M k-1[k,j]=1因此,M k[i,j]= M k-1[i,j] ∨(M k-1[i,k]=1∧M k-1[k,j]=1)四、实验要求:1、对输入的数据进行合法性检查,输入输出界面友好2、编写和调试完成程序3、保存和打印程序的运行结果五、实验步骤(一)算法描述Step 1 初始化MStep 2 刷新M 对k=1,2,┉n 重复Step 3和Step 4Step 3 刷新行对i=1,2,┉n 重复Step 4Step 4 刷新M ij对j=1,2,┉n置M ij=M ij ∨(M ik∧M kj)[结束Step 3循环][结束Step 2循环]Step 5 退出(二)流程图┉┉┉┉┉(三)程序清单┉┉┉┉┉六、测试数据1、输入关系矩阵的传递闭包的关系矩阵:R1=⎪⎪⎪⎭⎫⎝⎛001011001, R2=⎪⎪⎪⎪⎪⎭⎫ ⎝⎛0010001001000011, R3=⎪⎪⎪⎪⎪⎪⎭⎫⎝⎛0000000000110000010110010 输出的结果应为:t(R1)=⎪⎪⎪⎭⎫ ⎝⎛001011001, t(R2)=⎪⎪⎪⎪⎪⎭⎫⎝⎛0110011001100111,t(R3)=⎪⎪⎪⎪⎪⎪⎭⎫⎝⎛0000000000110001111111111参考程序:#include<stdio.h>#define N 3int main(){int i,j,k,M[N][N];printf("put in data 0 or 1\n");for(i=0;i<N;i++)for(j=0;j<N;j++)scanf("%d",&M[i][j]);printf("mibao:\n");for(k=0;k<N;k++)for(i=0;i<N;i++)for(j=0;j<N;j++)if((M[i][k]&&M[k][j])||M[i][j]) M[i][j]=1;for(i=0;i<N;i++){for(j=0;j<N;j++)printf(" %d",M[i][j]);printf("\n");}}输出结果:。
离散数学实验报告__四个实验!!!

《离散数学》课程设计学院计算机学院学生姓名学号指导教师评阅意见提交日期2011 年11 月25 日引言《离散数学》是现代数学的一个重要分支,也是计算机科学与技术,电子信息技术,生物技术等的核心基础课程。
它是研究离散量(如整数、有理数、有限字母表等)的数学结构、性质及关系的学问。
它一方面充分地描述了计算机科学离散性的特点,为学生进一步学习算法与数据结构、程序设计语言、操作系统、编译原理、电路设计、软件工程与方法学、数据库与信息检索系统、人工智能、网络、计算机图形学等专业课打好数学基础;另一方面,通过学习离散数学课程,学生在获得离散问题建模、离散数学理论、计算机求解方法和技术知识的同时,还可以培养和提高抽象思维能力和严密的逻辑推理能力,为今后爱念族皮及用计算机处理大量的日常事务和科研项目、从事计算机科学和应用打下坚实基础。
特别是对于那些从事计算机科学与理论研究的高层次计算机人员来说,离散数学更是必不可少的基础理论工具。
实验一、编程判断一个二元关系的性质(是否具有自反性、反自反性、对称性、反对称性和传递性)一、前言引语:二元关系是离散数学中重要的内容。
因为事物之间总是可以根据需要确定相应的关系。
从数学的角度来看,这类联系就是某个集合中元素之间存在的关系。
二、数学原理:自反、对称、传递关系设A和B都是已知的集合,R是A到B的一个确定的二元关系,那么集合R就是A×B的一个合于R={(x,y)∈A×B|xRy}的子集合设R是集合A上的二元关系:自反关系:对任意的x∈A,都满足<x,x>∈R,则称R是自反的,或称R具有自反性,即R在A上是自反的(x)((x∈A)→(<x,x>∈R))=1对称关系:对任意的x,y∈A,如果<x,y>∈R,那么<y,x>∈R,则称关系R是对称的,或称R具有对称性,即R在A上是对称的 (x)(y)((x∈A)∧(y∈A)∧(<x,y>∈R)→(<y,x>∈R))=1传递关系:对任意的x,y,z∈A,如果<x,y>∈R且<y,z>∈R,那么<x,z>∈R,则称关系R是传递的,或称R具有传递性,即R在A上是传递的 (x)(y)(z)[(x∈A)∧(y∈A)∧(z∈A)∧((<x,y>∈R)∧(<y,z>∈R)→(<x,z>∈R))]=1三、实验原理:通过二元关系与关系矩阵的联系,可以引入N维数组,以数组的运算来实现二元关系的判断。
- 1、下载文档前请自行甄别文档内容的完整性,平台不提供额外的编辑、内容补充、找答案等附加服务。
- 2、"仅部分预览"的文档,不可在线预览部分如存在完整性等问题,可反馈申请退款(可完整预览的文档不适用该条件!)。
- 3、如文档侵犯您的权益,请联系客服反馈,我们会尽快为您处理(人工客服工作时间:9:00-18:30)。
离散数学二元关系传递性判别、闭包方法实验报告
学院:理学院班级:11信息与计算科学1班
姓名:*** 学号:*************
一、实验目的
1. 通过上机程序,进一步加深对二元关系传递性判别,自反闭包,对称闭包,传递闭
包的理解。
2. 掌握传递性判别,Warshall算法。
3. 学会用程序解决离散数学中的问题。
4. 增强我们编写程序的能力
二、实验内容
实验1:二元关系传递性判别
实验2:有限集上给定关系的自反、对称和传递闭包(用Warshall算法)。
三、实验环境
在microsoft visual c++实验环境下完成的,而所设计的程序也在这个环境下通过了编译,运行和测试。
四、实验原理和实现过程
实验1:
#include <iostream>
using namespace std;
void main()
{
int n,i,j,k;
int m=0; //m是判断传递关系计数参数
cout<<"请输入矩阵的行列数n:";
cin>>n;
int a[20][20];
for(i=1;i<=n;i++)
{
for(j=1;j<=n;j++)
{
cout<<"请输入a["<<i<<"]["<<j<<"]:";
cin>>a[i][j];
}
} //输入R矩阵
cout<<"R的关系矩阵为:"<<endl;
for(i=1;i<=n;i++)
{
for(j=1;j<=n;j++)
{
cout<<a[i][j]<<" ";
}
cout<<endl;
} //输出R矩阵
for(i=1;i<=n;i++)
{
for(j=1;j<=n;j++)
{
if(a[i][j]!=0)
{
for(k=1;k<=n;k++)
{
if(a[i][k]<a[j][k] //利用布尔加的特征,前一行数大于后一行
{
m=m+1; //如果有一个数不成立,m加1
}
}
}
}
}
if(m==0) cout<<"R有传递关系"<<endl;
else cout<<"R没有传递关系"<<endl;
}
实验2:
1)自反闭包
#include <iostream>
using namespace std;
void main()
{
int n,i,j;
cout<<"请输入矩阵的行列数n:";
cin>>n;
int a[20][20];
for(i=1;i<=n;i++)
{
for(j=1;j<=n;j++)
{
cout<<"请输入a["<<i<<"]["<<j<<"]:";
cin>>a[i][j];
}
}
cout<<"R的关系矩阵为:"<<endl;
for(i=1;i<=n;i++)
{
for(j=1;j<=n;j++)
{
cout<<a[i][j]<<" ";
}
cout<<endl;
}
for(i=1;i<=n;i++)
{
for(j=1;j<=n;j++)
{
if(a[i][j]!=0)
{
a[i][i]=1;
a[j][j]=1; //把符合条件的对角线上的值改为1 }
}
}
cout<<"R的关系矩阵为:"<<endl;
for(i=1;i<=n;i++)
{
for(j=1;j<=n;j++)
{
cout<<a[i][j]<<" ";
}
cout<<endl;
}
}
2)对称闭包
#include <iostream>
using namespace std;
void main()
{
int n,i,j;
cout<<"请输入矩阵的行列数n:";
cin>>n;
int a[20][20];
for(i=1;i<=n;i++)
{
for(j=1;j<=n;j++)
{
cout<<"请输入a["<<i<<"]["<<j<<"]:";
cin>>a[i][j];
}
}
cout<<"R的关系矩阵为:"<<endl;
for(i=1;i<=n;i++)
{
for(j=1;j<=n;j++)
{
cout<<a[i][j]<<" ";
}
cout<<endl;
}
for(i=1;i<=n;i++)
{
for(j=1;j<=n;j++)
{
if(a[i][j]!=0)
{
a[j][i]=1; //对称元素的值改为1
}
}
}
cout<<"R的对称闭包矩阵为:"<<endl;
for(i=1;i<=n;i++)
{
for(j=1;j<=n;j++)
{
cout<<a[i][j]<<" ";
}
cout<<endl;
}
}
3)传递闭包
#include <iostream>
using namespace std;
void main()
{
int n,i,j,k;
int m=0;
cout<<"请输入矩阵的行列数n:";
cin>>n;
int a[20][20];
for(i=1;i<=n;i++)
{
for(j=1;j<=n;j++)
{
cout<<"请输入a["<<i<<"]["<<j<<"]:";
cin>>a[i][j];
}
}
cout<<"R的关系矩阵为:"<<endl;
for(i=1;i<=n;i++)
{
for(j=1;j<=n;j++)
{
cout<<a[i][j]<<" ";
}
cout<<endl;
}
for(j=1;j<=n;j++)
{
for(i=1;i<=n;i++)
{
if(a[i][j]==1)
{
for(k=1;k<=n;k++)
{
a[i][k]=a[i][k]+a[j][k]; //warshall方法
if(a[i][k]==2) a[i][k]=1; //规范布尔加
}
}
}
}
cout<<"R的传递闭包矩阵为:"<<endl;
for(i=1;i<=n;i++)
{
for(j=1;j<=n;j++)
{
cout<<a[i][j]<<" ";
}
cout<<endl;
}
}
五、实验输入输出和数据
实验1:
1)输入没有传递关系的关系矩阵R
2)输入课本P30/例2.6
实验2:
1)自反闭包
2)对称闭包
3)传递闭包P52/例2.13
六、实验体会
通过这次的实验,使我明白了,平日里学习不能浅尝辄止,必须要知道它的方法。
做这次实验前我以为我对这块知识已经很熟了,但实际做的时候,发现我还是不是特别懂,必须要反复看书。
其次,让我知道了,我平时学的数学知识可以很好的跟计算机结合,让我对程序设计有了更好的人是。