离散数学实验报告()
离散数学 实验报告

离散数学实验报告离散数学实验报告引言:离散数学是一门研究离散结构的数学学科,它对于计算机科学、信息技术等领域具有重要的应用价值。
本实验报告旨在通过实际案例,探讨离散数学在现实生活中的应用。
一、图论在社交网络中的应用社交网络已成为人们日常生活中不可或缺的一部分。
图论作为离散数学的重要分支,对于分析和研究社交网络具有重要意义。
以微信为例,我们可以通过图论的方法,分析微信中的好友关系、群组关系等。
通过构建好友关系图,我们可以计算某个人在社交网络中的影响力,进而预测他的行为模式。
二、布尔代数在电路设计中的应用布尔代数是离散数学中的重要内容,它在电路设计中扮演着重要的角色。
通过布尔代数的运算规则和定理,我们可以简化复杂的逻辑电路,提高电路的可靠性和效率。
例如,我们可以使用布尔代数中的与、或、非等逻辑运算符,设计出满足特定功能需求的逻辑电路。
三、排列组合在密码学中的应用密码学是离散数学的一个重要应用领域。
排列组合是密码学中常用的数学工具之一。
通过排列组合的方法,我们可以设计出强大的密码算法,保障信息的安全性。
例如,RSA加密算法中的大素数的选择,就涉及了排列组合的知识。
四、概率论在数据分析中的应用概率论是离散数学中的一门重要学科,它在数据分析中具有广泛的应用。
通过概率论的方法,我们可以对数据进行统计和分析,从而得出一些有意义的结论。
例如,在市场调研中,我们可以通过抽样调查的方法,利用概率论的知识,对整个市场的情况进行推断。
五、图论在物流规划中的应用物流规划是现代物流管理中的一个重要环节。
图论作为离散数学的重要分支,可以帮助我们解决物流规划中的一些问题。
例如,我们可以通过构建物流网络图,分析货物的流动路径,优化物流的运输效率,降低物流成本。
结论:离散数学作为一门重要的数学学科,在现实生活中具有广泛的应用。
通过对离散数学的学习和应用,我们可以解决实际问题,提高工作效率,推动社会的发展。
希望通过本实验报告的介绍,能够增加对离散数学的兴趣,进一步挖掘离散数学在实际生活中的潜力。
离散数学实验报告3

《离散数学》实验报告学院专业指导教师学号姓名提交日期实验三命题公式的范式一.实验目的熟悉逻辑运算否定、合取、析取、蕴含、等价规则,利用程序语言实现命题公式的真值表运算,求公式的主析取范式及主合取范式。
二.实验内容(一)用真值表法求出下列公式的主析取范式及主合取范式。
p ∧(q ↔r)(二)选课方案某学生要从A、B 、C 三门选修课中选修1~2门,根据学校的排课计划以及该生的实际情况,选择时必须满足以下条件:(1) 若选择A,则必须选择C;(2) 若选择B,则不能选择C;(3) 若不选择C,则可选择A或B。
问该生有几种选择方案。
(三)讨论公司派遣方案:派小李或小张去上海出差。
若派小李去,则小赵要加班。
若派小张去,小王也得去。
但小赵没有加班。
问公司是如何派遣的。
令p:小李去上海q:小张去上海r: 小赵加班s: 小王去上海三. 实验过程(一)求公式的主析取范式及主合取范式。
1. 算法分析:列出命题公式,说明程序设计思路。
2. 程序代码:3.实验数据及结果分析列出求解的真值表,并筛选出正确答案。
(二)选课方案- 1 -1. 算法分析:列出命题公式,说明程序设计思路。
2. 程序代码:3.实验数据及结果分析列出求解的真值表,并筛选出正确答案。
(三)讨论公司派遣方案:1. 算法分析:列出命题公式,说明程序设计思路。
2. 程序代码:3.实验数据及结果分析列出求解的真值表,并筛选出正确答案。
- 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.集合的应用:介绍了集合在数学、计算机科学中的应用,如数据库的查询、关系代数等。
二、关系相关概念及应用1.定义:关系是一个元素与另一个元素之间的对应关系。
介绍了关系的基本概念、关系的表示方法及其运算。
2.关系的应用:介绍了关系在图像处理、社交网络分析等领域的应用,如图像中的像素点之间的关系、社交网络中用户之间的关系等。
三、图论基础知识及应用1.定义:图是由顶点和边组成的抽象的数学模型。
介绍了图的基本概念、图的表示方法和图的运算。
2.图论的应用:介绍了图论在路由算法、电子商务等领域的应用,如路由器的路由选择、电子商务中的商品推荐等。
四、布尔代数的概念及应用1.定义:布尔代数是一种基于集合论和逻辑学的代数系统。
介绍了布尔代数的基本概念、布尔表达式及其化简方法。
2.布尔代数的应用:介绍了布尔代数在电路设计、开关控制等方面的应用,如逻辑门电路的设计、开关控制系统的建模等。
五、递归的概念及应用1.定义:递归是一种通过调用自身来解决问题的方法。
介绍了递归的基本原理、递归的应用技巧。
2.递归的应用:介绍了递归在算法设计、树的遍历等方面的应用,如快速排序算法、树结构的遍历等。
总结:通过本次离散数学的实验学习,我深入掌握了集合、关系、图论等基本概念与应用。
集合的应用在数据库查询、关系代数等方面起到了重要的作用。
关系的应用在图像处理、社交网络分析等领域有广泛的应用。
中南大学自动化专业离散数学实验报告2

中南大学自动化专业离散数学实验报告2离散数学作为计算机科学与技术专业的基础课程之一,对于培养学生的逻辑思维和抽象思维能力具有重要意义。
本次实验是关于离散数学中的图论部份,通过实际操作和计算来理解和应用图的相关概念和算法。
实验一开始,我们首先学习了图的基本概念和术语,例如顶点、边、路径、回路等。
然后,我们学习了图的表示方法,包括邻接矩阵和邻接表。
通过实际操作,我们发现邻接矩阵适合表示稠密图,而邻接表适合表示稀疏图。
这种不同的表示方法对于图的遍历和搜索算法有着重要的影响。
接下来,我们进行了图的遍历实验。
通过深度优先搜索和广度优先搜索算法,我们可以遍历图中的所有节点,并找到特定节点之间的路径。
深度优先搜索算法通过递归的方式进行,它会首先访问一个节点的所有邻接节点,然后再递归地访问这些邻接节点的邻接节点。
广度优先搜索算法则是通过队列的方式进行,它会首先访问一个节点的所有邻接节点,然后将这些邻接节点按照访问的顺序加入队列中,再逐个出队进行访问。
通过实验,我们发现深度优先搜索算法更适适合于寻觅路径,而广度优先搜索算法更适适合于寻觅最短路径。
在实验的后半部份,我们学习了最小生成树和最短路径算法。
最小生成树算法用于找到一个连通图的最小生成树,其中包含了连接图中所有节点的最短路径。
我们学习了Prim算法和Kruskal算法,它们分别基于贪心算法和并查集来实现。
通过实验,我们发现Prim算法适适合于稠密图,而Kruskal算法适适合于稀疏图。
最短路径算法用于找到两个节点之间的最短路径,我们学习了Dijkstra算法和Floyd算法。
Dijkstra算法通过贪心策略逐步更新节点之间的最短路径,而Floyd算法则通过动态规划的方式计算所有节点之间的最短路径。
通过实验,我们发现Dijkstra算法适适合于稀疏图,而Floyd算法适适合于稠密图。
总结起来,本次实验让我们深入了解了离散数学中的图论部份,并通过实际操作和计算来应用图的相关概念和算法。
离散数学(集合的运算)实验报告

大连民族学院计算机科学与工程学院实验报告实验题目:集合的运算课程名称:离散数学实验类型:□演示性□验证性□操作性□设计性□综合性专业:网络工程班级:网络111班学生姓名:张山学号:2011083123实验日期:2013年12月22日实验地点:I区实验机房实验学时:8小时实验成绩:指导教师签字:年月日老师评语:实验题目:集合的运算实验原理:1、实验内容与要求:实验内容:本实验求两个集合间的运算,给定两个集合A、B,求集合A与集合B之间的交集、并集、差集、对称差集和笛卡尔乘积。
实验要求:对于给定的集合A、B。
用C++/C语言设计一个程序(本实验采用C++),该程序能够完成两个集合间的各种运算,可根据需要选择输出某种运算结果,也可一次输出所有运算结果。
2、实验算法:实验算法分为如下几步:(1)、设计整体框架该程序采取操作、打印分离(求解和输出分开)的思想。
即先设计函数求解各部分运算并将相应结果传入数组(所求集合)中,然后根据需要打印运算结果。
(2)、建立一个集合类(Gather)类体包括的数组a、b、c、d、e、f、g分别存储集合A、B以及所求各种运算的集合。
接口(实现操作的函数)包括构造函数,菜单显示函数,求解操作函数,打印各种运算结果等函数。
(3)、设计类体中的接口构造函数:对对象进行初始化,建立集合A与集合B。
菜单显示函数:设计提示选项,给使用者操作提示。
操作函数:该函数是程序的主题部分,完成对集合的所有运算的求解过程,并将结果弹入(存入)对应数组(集合)中,用于打印。
具体操作如下:1*求交集:根据集合中交集的定义,将数组a、b中元素挨个比较,把共同元素选出来,并存入数组c(交集集合)中,即求得集合A、B的交集。
2*求并集:根据集合中并集的定义,先将数组a中元素依次存入数组g(并集集合)中,存储集合A中某元素前,先将其与已存入g中的元素依次比较,若相同则存入下一个元素,否则直接存入g中,直到所有A中元素存储完毕。
离散实验报告一

离散数学实验报告(一)一、实验目的求命题公式的真值表及其主析取范式和主合取范式二、问题分析本程序最终的目的应是求命题公式的主析取范式和主合取范式,而在有命题真值表的情况下,主析取范式和主合取范式的求解将变得十分简单。
所以,该程序的关键问题应该是求解命题公式的真值表,此后在真值表的基础上完成主析取范式和主合取范式的求解。
(一)前期分析与部分变量准备规定前提,真值表中的T/F在该程序中用布尔类型的1/0来表达。
如此,可以方便程序的编写与运算。
首先,我们要确定各个联结词的符号表达,为了方便讨论,不妨在此先令各联结词表达如下:合取(*)、析取(/)、否定(-)、单条件(%)、双条件(@)。
接着,我们就需要明确各联结词所对应符号在程序中的功能。
具体来看,合取与析取可以分别使用c++自带的&&(且)和||(或)进行布尔运算,取否定也可以直接使用!(取非)运算;而对于单条件、双条件这两个联结词来看,在c++中并无已有的运算定义,所以我们要利用函数定义的方式重新明确其含义。
而后,定义char类型数组a[]用于存储命题公式,为了方便程序的实现,我们将命题变元与联结词分开存储于char类型数组b[]和c[]中。
(二)真值表输出算法以下,我们便进入了程序的核心部分——完成真值表的计算与输出。
碍于本人c++编程知识的局限,暂时只能实现输入三个变元、无否定情况下的命题公式的真值表输出。
为了完成真值表的输出,要解决以下几个问题1. 真值表的格式与指派控制对此,我们使用三层for语句嵌套完成真值表的每一行输出。
在循环的同时,我们还需要提前定义一个布尔数组p[],以根据每一行的输出完成三个变元的指派,并将其存储于数组p[]中。
2.真值表每一行结尾的结果计算首先,我们需要定义一个布尔类型的过程存储数组x[],利用switch语句的嵌套分别判断两个联结词,使用相应的运算符(&&、||、!)和已定义的两个布尔类型函数(imp、equ),一次计算,并且将每一次的计算结果存储至x[]中,运算直至最后一步完成结果的输出。
离散数学实验报告(极大相容类)

华侨大学离散数学实验报告极大相容类姓名:吴非凡专业:计算机科学与技术班级:10级1班学号:0715112015 日期:2012/11/16实验类型:学习型实验实验要求和目的:通过本实验加深理解相容关系的极大相容类,学习并掌握用所学过的程序设计语言实现求相容关系的极大相容类的方法一.导言1) 问题的描述用二维数组存储相容关系矩阵,用课堂上所介绍的矩阵法求给定相容关系的所有极大相容类。
要求分别输入两组实验数据,输出并打印运行结果。
2) 拟采用的方法根据输入的集合元素及给定的二元相容关系,构建关系矩阵,并按照给定的关系矩阵法求得最终的极大相容类。
二.实验过程1) 算法思想流程关系矩阵法:设R为{x1,…,xn}上的相容关系,MR=[aij]nxn1) 令π={{x1},…,{xn}},若n=1,则终止;2)i:=n-1;3) A:={xj|aji=1∧i<j≤n};4) ∀Sπ∈,若S∩A∅≠,则π:=π∪{{xi}∪(S∩A};5) ∀S1,S2π∈,若S1⊆S2,则π:=π-{S1};6) 若i>1,则i:=i-1,转3),否则结束。
2) 程序流程图略3) 功能模块说明略三.结果分析1) 实验环境:VC++2) 算法设计的参数说明siri:字符串型,用来存放集合元素kiki:字符串型,用来存放给定的二元向荣关系(序偶对)n: 整型,集合元素个数siriC[][] 字符串型,存放极大相容类3) 实验结果如下图:4) 结果分析与讨论程序运行结果与手工运算结果相符5) 算法的优缺点算法简单、通俗易懂6) 实验的不足之处及改进设想输入限制较高,集合元素目前只能用阿拉伯数字,适用性差四.实验心得通过这次离散数学实验,相当于让我对过去学过的知识再学习,并且使我发现了自己的许多不足。
如对某些知识点记得不够牢,理解不够透彻等等。
同时,编写源程序的时候,我发觉由于疏于练习,许多C++的知识已经逐渐淡忘,编译过程中出现的错误都是很低级的错误,甚至于有一个小错误我竟耗费了不短的时间才找到,这又一次提醒了我身为一名程序员,必须经常动手,找找“手感”,而不能仅仅在脑中模拟,不去实践。
- 1、下载文档前请自行甄别文档内容的完整性,平台不提供额外的编辑、内容补充、找答案等附加服务。
- 2、"仅部分预览"的文档,不可在线预览部分如存在完整性等问题,可反馈申请退款(可完整预览的文档不适用该条件!)。
- 3、如文档侵犯您的权益,请联系客服反馈,我们会尽快为您处理(人工客服工作时间:9:00-18:30)。
《离散数学》实验报告专业网络工程班级姓名学号授课教师二 O 一六年十二月目录实验一联结词的运算实验二根据矩阵的乘法求复合关系实验三利用warshall算法求关系的传递闭包实验四图的可达矩阵实现实验一联结词的运算一.实验目的通过上机实验操作,将命题连接词运算融入到C语言的程序编写中,一方面加强对命题连接词运算的理解,另一方面通过编程实现命题连接词运算,帮助学生复习和锻炼C语言知识,将理论知识与实际操作结合,让学生更加容易理解和记忆命题连接词运算。
二.实验原理(1) 非运算, 符号: ,当P=T时,P为F, 当P=F时,P为T 。
(2) 合取, 符号: ∧ , 当且仅当P和Q的真值同为真,命题P∧Q的真值才为真;否则,P∧Q的真值为假。
(3) 析取, 符号: ∨ , 当且仅当P和Q的真值同为假,命题P∨Q的真值才为假;否则,P∨Q的真值为真。
(4) 异或, 符号: ▽ , 当且仅当P和Q的真值不同时,命题P▽Q的真值才为真;否则,P▽Q的真值为真。
(5) 蕴涵, 符号: →, 当且仅当P为T,Q为F时,命题P→Q的真值才为假;否则,P→Q 的真值为真。
(6) 等价, 符号: ↔, 当且仅当P,Q的真值不同时,命题P↔Q的真值才为假;否则,P→Q的真值为真。
三.实验内容编写一个程序实现非运算、合取运算、析取运算、异或运算、蕴涵运算、等价运算。
四.算法程序#include<stdio.h>void main(){printf("请输入P、Q的真值\n");int a,b;scanf("%d%d",&a,&b);int c,d;if(a==1)c=0;else c=1;if(b==1)d=0;else d=1;printf("非P、Q的结果为%d,%d\n",c,d);int e;if(a==1&&b==1)e=1;else e=0;printf("合取的结果为%d\n",e);int f;if(a==0&&b==0)f=0;else f=1;printf("析取的结果为%d\n",f);int g;if(a==1&&b==0)g=0;else g=1;printf("单条件的结果为%d\n",g);int h;if(a==b)h=1;else h=0;printf("双条件的结果为%d\n",h);}内容格式:新罗马,五号,行间距固定值18磅五.实验结果六.心得体会通过编程,学会了析取、合取、单条件连接词、双条件连接词的用法。
实验二 根据矩阵的乘法求复合关系一.实验目的复合运算是一种重要的二元关系运算,可用于二元关系的合成,二元关系的性质判断,二元关系传递闭包的运算等方面,通过编程实现二元关系的复合运算,帮助同学们理解复合运算的过程,复合形成新的二元关系中的序偶是如何产生的。
二.实验原理复合运算能由两个二元关系生成一个新的二元关系。
设X →Y(R 关系),Y →Z(S 关系),则称X →Z(R ◦S 关系)为R 和S 的复合关系,并规定为:R ◦S ={<x,z>|x ∈X ∧z ∈Z ∧∃y(y ∈Y ∧<x,y>∈R ∧<y,z>∈S)}关系可用矩阵表示,故复合运算也可用矩阵表示。
设有三个集合:X={x 1,x 2…x m },Y={y 1,y 2…y n },Z={z 1,z 2…z p }, Z Y X SR −→−−→−,|X|=m, |Y|=n, |Z|=p,M R =[a ik ]m ×n ,M S =[a kj ]n ×p 则复合关系R ◦S 的关系矩阵为:M R ◦S = M R ◦M S =[c ij ] m ×p )(1kjik n k ij b a c ∧=∨= ∨代表逻辑加,满足0∨0=0,0∨1=1,1∨0=1,1∨1=1∧代表逻辑乘,满足0∧0=0,0∧1=0,1∧0=0,1∧1=1三.实验内容将二元关系用关系矩阵表示,通过两个关系矩阵对应行列元素先进行逻辑乘,后进行逻辑加生成新的关系矩阵中的每一个元素。
新的关系矩阵所对应的二元关系就是两个二元关系复合形成的,编程实现这一复合过程。
四.算法程序#include <stdio.h>int main(){int a[100][100],b[100][100],c[100][100],i,j,k,n;printf("请输入集合X 中元素个数:");scanf("%d",&n); printf("请输入关系矩阵Mr 的格式:\n");for(i=0;i<n;i++){for(j=0;j<n;j++)scanf("%d",&a[i][j]);}printf("请输入关系矩阵Ms的格式:\n");for(i=0;i<n;i++){for(j=0;j<n;j++)scanf("%d",&b[i][j]);}for(i=0;i<n;i++){for(j=0;j<n;j++) if(a[i][j]==1)for(k=0;k<n;k++) if(b[j][k]==1)c[i][k]=1;}for(i=0;i<n;i++){for(j=0;j<n;j++)if(c[i][j]!=1)c[i][j]=0;}printf("\n");printf("关系矩阵Mr和Ms的复合运算结果是:\n");for(i=0;i<n;i++){for(j=0;j<n;j++)printf("%d ",c[i][j]);printf("\n");}return 0;}五.实验结果实验结果截图大小为:宽(10cm)×高(8cm)六.心得体会通过编程,更加深入的了解了矩阵复合运算法则。
实验三 利用warshall 算法求关系的传递闭包一.实验目的对于一个二元关系R,它的传递闭包(t(R))就是包含R,并且具有传递性质的最小二元关系。
传递闭包在图论、数据库、编译原理、计算机形式语言中都有重要的应用。
warshall 算法是计算传递闭包的一种有效算法,通过编程实现warshall 算法,帮助同学们更好地理解传递闭包的生成过程。
二.实验原理设X 是含有n 个元素的集合,R 是X 上的二元关系,则:23()n t R R R R R =U U UL U以上计算传递闭包时需要按照复合关系定义求i R ,这是比较麻烦的,特别当有限集合元素比较多时计算量很大。
1962年Warshall 提出了一个求t(R)的有效计算方法:设R 是n 个元素集合上的二元关系,R M 是R 的关系矩阵:第一步:置新矩阵M ,R M M ←;第二步:置i ,1←i ;第三步:对)1(n j j ≤≤,若M 的第j 行i 列处为1,则对n k ,,2,1Λ=作如下计算: 将M 的第j 行第k 列元素与第i 行第k 列元素进行逻辑加,然后将结果送到第j 行k 列处,即 ],[],[],[k i M k j M k j M ∨←;第四步:1+←i i ;第五步:若n i ≤,转到第三步,否则停止。
三.实验内容将二元关系用关系矩阵表示,编程实现Warshall 算法,获得二元关系传递闭包的关系矩阵。
四.算法程序#include <stdio.h>#include <math.h>void main(){int A[10][10];int n,i,j,k; printf("输入关系矩阵的维数n(n<10)\n");scanf("%d",&n);printf("输入n*n个数据(0 or 1)\n");for(i=1;i<=n;i++){for(j=1;j<=n;j++){scanf("%d",&A[i][j]);if(A[i][j]!=1&&A[i][j])printf("There is an error");}}for(i=1;i<=n;i++){for(j=1;j<=n;j++){for(k=1;k<=n;k++){if(A[i][j]&&(A[i][k]||A[j][k]))A[i][k]=1;}}}printf("传递闭包的关系矩阵:\n");for(i=1;i<=n;i++){for(j=1;j<=n;j++)printf("%2d",A[i][j]);printf("\n");}}五.实验结果六.心得体会通过编程,深入了解什么是Warshall算法,也加深了对传递闭包的了解。
实验四 图的可达矩阵实现一.实验目的可达矩阵表明了图中任何两个不同的结点之间是否存在至少一条道路,以及在任何结点处是否存在着回路。
可达性矩阵是判别一个有向图是否为强连通图或弱连通图的有效工具,通过编程实现图形的可达矩阵,帮助同学们掌握可达矩阵生成方法。
二.实验原理定义 设G=(V ,E )是一个n 阶的有向简单图,{}n v v v V ,,,21Λ=。
定义矩阵n n j i p P ⨯=)(,其中⎩⎨⎧=,,v v p j i ij 其它存在非零的有向道路到从,0,1称P 是图G 的可达矩阵。
求可达矩阵可以先构造A ,n A A ,,2Λ,再构造n n A A A B Λ++=2,最后利用关系⎪⎩⎪⎨⎧=>=,b ,b p n tj n ij ij 0,00,1)()(若若 确定P 的元素ij p 从而构造出P 。
显然,这种先求n n B A A A A ,,,,,32Λ再构造P 的方法很费事 。
如果我们把邻接矩阵A 当作关系矩阵,那么求可达矩阵就相当于求A 的传递闭包,因此可以仿照集合论中求关系的传递闭包的办法,求可达矩阵P 。
三.实验内容将图形中的边表达成二元关系,计算该二元关系的传递闭包,并将传递闭包表达成关系矩阵,该关系矩阵就是图形的可达矩阵,编程实现求可达矩阵的过程。
四.算法程序#include<stdio.h>#define N 4void TransitiveClosure(int dist[N][N],int t[N][N])//寻找可达矩阵{for(int i=0;i<N;i++)//进行遍历for(int j=0;j<N;j++){if((i==j)||(dist[i][j])==1)t[i][j]=1;elset[i][j]=0;}for(int k=0;k<N;k++)for(int i=0;i<N;i++)for(int j=0;j<N;j++)t[i][j]=t[i][j]||(t[i][k]&&t[k][j]);}void main(){int i,j;int dist[N][N]={{1,0,0,0},{0,1,1,1},{0,1,1,0},{1,0,1,1}};printf("邻接矩阵举例如下:\n");for( i=0;i<N;i++){for( j=0;j<N;j++)printf("%d ",dist[i][j]);printf("\n");}int t[N][N]={0};TransitiveClosure( dist, t);printf("其对应可达矩阵如下:\n");for( i=0;i<N;i++){for( j=0;j<N;j++)printf("%d ",t[i][j]);printf("\n");}}五.实验结果六.心得体会有了邻接矩阵,通过遍历,判断是否可达,通过for语句找出可达矩阵。