实验一 传递闭包的实现(离散数学实验报告)
- 1、下载文档前请自行甄别文档内容的完整性,平台不提供额外的编辑、内容补充、找答案等附加服务。
- 2、"仅部分预览"的文档,不可在线预览部分如存在完整性等问题,可反馈申请退款(可完整预览的文档不适用该条件!)。
- 3、如文档侵犯您的权益,请联系客服反馈,我们会尽快为您处理(人工客服工作时间:9:00-18:30)。
实验一传递闭包算法
一、实验目的
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 初始化M
Step 2 刷新M 对k=1,2,┉n 重复Step 3和Step 4
Step 3 刷新行对i=1,2,┉n 重复Step 4
Step 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=⎪⎪⎪⎪⎪⎭⎫ ⎝⎛001000
1001000011, R3=⎪⎪
⎪⎪⎪
⎪⎭
⎫
⎝⎛0000000000110000010110010 输出的结果应为:
t(R1)=⎪⎪⎪⎭⎫ ⎝⎛001011001, t(R2)=⎪⎪⎪⎪⎪⎭⎫
⎝⎛0110011001100111,
t(R3)=⎪⎪⎪⎪⎪⎪⎭⎫
⎝⎛00
00000
00011
00011111
11
111
参考程序:
#include
#define N 3
int main()
{
int i,j,k,M[N][N];
printf("put in data 0 or 1\n");
for(i=0;i for(j=0;j scanf("%d",&M[i][j]); printf("mibao:\n"); for(k=0;k for(i=0;i for(j=0;j if((M[i][k]&&M[k][j])||M[i][j]) M[i][j]=1; for(i=0;i { for(j=0;j printf(" %d",M[i][j]); printf("\n"); } } 输出结果: