实验一 传递闭包的实现(离散数学实验报告)

合集下载
  1. 1、下载文档前请自行甄别文档内容的完整性,平台不提供额外的编辑、内容补充、找答案等附加服务。
  2. 2、"仅部分预览"的文档,不可在线预览部分如存在完整性等问题,可反馈申请退款(可完整预览的文档不适用该条件!)。
  3. 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");

}

}

输出结果:

相关文档
最新文档