离散数学实验报告__四个实验!!! 下载本文

内容发布更新时间 : 2024/11/9 10:33:14星期一 下面是文章的全部内容请认真阅读。

.

八、实验总结

如果当一个集合的元素的个数n很大时,求在该集合上的二元关系的可传递闭包是非常复杂的。幸好Warshall算法给我们提供了一个求二元关系的可传递闭包的高效方法。结合计算机程序技术,利用warshall算法我们可以轻松的求出一个二元关系的可传递闭包。本次实验便捷高效地达到了实验的目的。

实验三、编程求一个二元关系的复合运算

一、实验引语:关系作为集合,除了具有一般的运算功能外,还具有自身独

特的复合运算。

二、数学原理

设R是集合A到B的二元关系,S是集合B到C的二元关系,则

R。S = {(x,z) A C|(y B)[(x,y) R ∧ (y,z)S]}称为R和S的复合关系。

三、实验原理:矩阵的运算

四、实验环境:Windows 7 Ultimate DEV C++ 五、实验语言:C语言 六、实验程序源代码

#include\#include\#define M 3

word资料

.

#define N 3 #define P 3 main() {

int i,j,k,x; char p;

int A[N][M],B[M][P],C[N][P]; printf(\关系的复合运算\\n\

printf(“请输入一个3*3的矩阵”); printf(\ for(i=1;i<=N;i++) {

for(j=1;j<=M;j++)

scanf(\ printf(\ }

printf(“请输入一个3*3的矩阵”); printf(\ for(i=1;i<=M;i++) {

for(j=1;j<=P;j++)

scanf(\ printf(\ }

printf(\经过复合运算后得到C:\\n\ for(i=1;i<=N;i++) {

for(j=1;j<=P;j++) {

x=0;

for(k=1;k<=M;k++) x=x+A[i][k]*B[k][j]; if(x>0) C[i][j]=1; else

C[i][j]=0;

printf(\ }

printf(\ }

system(\ return 0;

word资料

.

}

七、程序运行截图:

i、程序启动截图:

ii、程序输入截图:

iii、程序运行结果截图:

word资料

.

八、实验总结:本实验利用计算机技术,快速便捷地实现了关系的运算,极

大提高了效率。

实验四:编程实现拓扑排序算法

一、实验引言

一个复杂的工程通常可以分解成一组小任务的集合,完成这些小任务意味着整个工程的完成,,任务之间具有先后关系,任务的先后顺序可用有向图表示。

二、数学原理:拓扑排序

i)定义:由某个集合上的一个偏序得到该集合上的一个全序,这个操作称之为拓扑排序。 ii)实现方法:

①从有向图中选择一个没有前驱的顶点并输出它。

②从网中删去该顶点并删去从该顶点发出的全部有向边。 ③重复上述两步直到剩余的网中不存在没有前驱的顶点。

三、实验原理

首先对有向图,我们采取邻接表作为数据结构。且将表头指针改为头结点,其数据域存放该结点的入度,入度设为零的结点即没有前趋。

在建立邻接表输入之前,表头向量的每个结点的初始状态为数据域VEX(入度)为零,指针域NXET为空,每输入一条弧< J, K > 建立链表的一个结点,同时令k 的入度加1,因此在输入结束时,表头的两个域分别表示顶点的入度和指向链表的第一个结点指针。

在拓扑排序的过程之中,输入入度为零(即没有前趋)的顶点,同时将该顶点的直接后继的入度减1。

word资料

.

(1)、查邻接表中入度为零的顶点,并进栈。 (2)、当栈为空时,进行拓扑排序。

(a)、退栈,输出栈顶元素V。 (b)、在邻接表中查找Vj的直接后继Vk,将Vk的入度减一,并令入

度减至零的顶点进栈。

(3)、若栈空时输出的顶点数不是N个则说明有向回路,否则拓扑排序结束。为建立存放入度为零的顶点的栈,不需要另分配存储单元,即可借入入度为零的数据域。一方面,入度为零的顶点序号即为表头结点的序号,另一方面,借用入度为零的数据域存放带链栈的指针域(下一个入度的顶点号)。

四、实验环境:Windows 7 Ultimate DEV C++

五、实验语言:C++

六、程序源代码

#include #include #include #include #include

using namespace std; #define MAX 9999 stackmystack; int indegree[MAX]; struct node {

int adjvex; node* next; }adj[MAX];

int Create(node adj[],int n,int m)//邻接表建表函数,n代表定点数,m代表边数

{

int i; node *p;

for(i=0;i<=n-1;i++) {

adj[i].adjvex=i; adj[i].next=NULL; }

for(i=0;i<=m-1;i++) {

cout<<\请输入第\条边:\

word资料