- 1、原创力文档(book118)网站文档一经付费(服务费),不意味着购买了该文档的版权,仅供个人/单位学习、研究之用,不得用于商业用途,未经授权,严禁复制、发行、汇编、翻译或者网络传播等,侵权必究。。
- 2、本站所有内容均由合作方或网友上传,本站不对文档的完整性、权威性及其观点立场正确性做任何保证或承诺!文档内容仅供研究参考,付费前请自行鉴别。如您付费,意味着您自己接受本站规则且自行承担风险,本站不退款、不进行额外附加服务;查看《如何避免下载的几个坑》。如果您已付费下载过本站文档,您可以点击 这里二次下载。
- 3、如文档侵犯商业秘密、侵犯著作权、侵犯人身权等,请点击“版权申诉”(推荐),也可以打举报电话:400-050-0827(电话支持时间:9:00-18:30)。
- 4、该文档为VIP文档,如果想要下载,成为VIP会员后,下载免费。
- 5、成为VIP后,下载本文档将扣除1次下载权益。下载后,不支持退款、换文档。如有疑问请联系我们。
- 6、成为VIP后,您将拥有八大权益,权益包括:VIP文档下载权益、阅读免打扰、文档格式转换、高级专利检索、专属身份标志、高级客服、多端互通、版权登记。
- 7、VIP文档为合作方或网友上传,每下载1次, 网站将根据用户上传文档的质量评分、类型等,对文档贡献者给予高额补贴、流量扶持。如果你也想贡献VIP文档。上传文档
《离散数学》
课程设计
学 院 软件学院
学生姓名 孟庆汉
学 号 0843042109 年级2008
指导教师 冯伟森
评阅意见
提交日期 2009 年12 月25 日
《利用Warshall算法求二元关系的可传递闭包》
学生:孟庆汉指导老师:冯伟森
摘要:当集合的阶数n较大时,求二元关系的可传递闭包的工作量是相当庞大的。幸运的是1962年S.Warshall提出了一个计算R+的有效方法,可在计算机上编程
R实现。采用C语言函数写出这个算法。程序中用m[i][j]表示关系矩阵M的第i
R
行第j列元素,用||表示逻辑或计算。计算R+的函数名为Warshall,它的两个形式参数m和n分别表示关系矩阵M和矩阵的行数。函数的实现实际上是一个三重循环构成。
关键字:二元关系关系矩阵可传递闭包Warshall算法三重循环
引言
《离散数学》是现代数学的一个重要分支,也是计算机科学与技术,电子信息技术,生物技术等的核心基础课程。二元关系是离散数学中重要的内容。世界上的事物都在一定范围内以某种方式互相联系,例如天体之间可以用的是同一星系来划分,人们之间可以用是否有共同的祖先来定血缘。类似的数学或者计算机科学中的研究对象也以各种不同的形式相互联系着,例如整数之间以大小,整除或同余等关系相互连接着,命题公式之间以是否有相同的主合取范式相联系,程序中两个变量可以用是否占有同一内存地址相联系。
总之,事物之间总是可以根据需要确定相应的关系。从数学的角度来看,这类联系就是某个集合中元素之间存在的关系。一个二元关系可能具有某种性质,也可能不具有这种性质。关系的闭包就是使一个二元关系变成具有指定性质的关系,并且还要满足最小性的条件。
数学原理
设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
设R是定义在A上的二元关系,若存在A上的关系R′满足:
R′是自反的(或对称的、或可传递的),2) R?R′,
3) 对A上任何其它满足1)和2)的关系R〞,都有:R′?R〞。(表明R′的最小性)
则称R′为R的自反闭包(或对称闭包、或传递闭包),分别记为r(R)(s(R)或t(R))。
Warshall算法的基本思想
对每个结点(从第一列开始),找出所有具有到此结点的有向边的结点(即该列中元素为1的所在行的结点),再将这些结点所在行同该结点所在行进行逻辑加后作为这些结点所在的新行(添加新的有向边)(反映了如果这些结点没有到其它结点的有向边,但有到该结点的有向边,再通过该结点间接到达其它结点,根据传递闭包的定义,这些结点就必然有一条有向边到达其它结点)。
设R是集合上的二元关系,Mr是R的关系矩阵
(1)置新矩阵A:=Mr
(2)置(列) j:=1
(3)对所有的i(1≤i≤n)
如A(i,j)=1,则对k=1,2,…,nA(i,k):=A(i,k)?A(j,k)
(即将A的第i行与A的第j行进行逻辑加后送回A的第i行)
(4)j:=j+1
(5)如j≤n转(3),否则停止。
实验流程图
开始
开始
输入矩阵的
行数和列数
输入矩阵各
元素的值
输入正确?
N
Y
计算出可传递闭包关
系矩阵
打印可传递闭包的关
系矩阵
结束
程序源代码
//sourcefile:warshall.cpp#includestdio.h
voidwarshall(intm,intn)
{
inti,j,k;
intarr[10][10];for(inta=0;am;++a)
{
printf(请输入矩阵第%d行元素:,a);for(int b=0;bn;++b)
{
scanf(%d,arr[a][b]);
}
文档评论(0)