离散作业河北工业大学文档格式.docx

上传人:b****3 文档编号:16802759 上传时间:2022-11-26 格式:DOCX 页数:14 大小:86.08KB
下载 相关 举报
离散作业河北工业大学文档格式.docx_第1页
第1页 / 共14页
离散作业河北工业大学文档格式.docx_第2页
第2页 / 共14页
离散作业河北工业大学文档格式.docx_第3页
第3页 / 共14页
离散作业河北工业大学文档格式.docx_第4页
第4页 / 共14页
离散作业河北工业大学文档格式.docx_第5页
第5页 / 共14页
点击查看更多>>
下载资源
资源描述

离散作业河北工业大学文档格式.docx

《离散作业河北工业大学文档格式.docx》由会员分享,可在线阅读,更多相关《离散作业河北工业大学文档格式.docx(14页珍藏版)》请在冰豆网上搜索。

离散作业河北工业大学文档格式.docx

在输入P、Q真值后,会依次输出合取、析取、条件、双条件的真值。

本实验源程序力求简洁易懂,所以在设计时应用简单的语句并省去了许多繁杂的选择,如1与T、0与F的置换等。

但本实验在操作易于理解方面也有很大的体现。

4.源程序:

(1)方法一:

#include<

stdio.h>

voidmain(void){

printf("

输入P、Q的真值(1为T,0为F):

\n"

);

intP,Q;

scanf("

%d"

&

P);

//输入P、Q的值

Q);

//求真值

合取:

%d\n"

P&

&

析取:

P||Q);

条件:

!

P||Q);

双条件:

Q+!

P&

!

}

(2)方法二:

iostream>

usingnamespacestd;

intmain(){

charP,Q;

inti;

cout<

<

"

请输入两个命题的真值(T/F):

endl;

for(i=1;

i<

=4;

i++){

cin>

>

P;

Q;

if(P=='

T'

Q=='

cout<

合取为T,析取为T,条件为T,双条件为T"

elseif(P=='

F'

合取为F,析取为T,条件为F,双条件为F"

合取为F,析取为T,条件为T,双条件为F"

合取为F,析取为F,条件为T,双条件为T"

}

5.实验结果:

实验二关系闭包计算

熟悉Warshall算法,掌握求关系的自反闭包、对称闭包和传递闭包的方法。

定义6设R是A上的二元关系,R的自反(对称、传递)闭包是关系R1,则

①R1是自反的(对称的、传递的)

②RR1

3对任何自反的(对称的、传递的)关系R2,若RR2,则R1R2。

R的自反、对称和传递闭包分别记为r(R)、s(R)和t(R)。

定理1令RAA,则

①r(R)=R∪IA

②s(R)=R∪R-1

③t(R)=R∪R2∪R3…

Warshall算法:

设R是n个元素集合上的二元关系,M是R的关系矩阵;

(1)置新矩阵A:

=M

(2)置i:

=1;

(3)forj=1tondo

ifA[j,i]=1thendo

fork=1tondo

A[j,k]:

=A[j,k]+A[i,k]

(4)i=i+1;

(5)ifi<

=nthento(3)

(6)

(7)

(8)

(9)

(10)

(11)

(12)

(13)

(14)

(15)

(16)

(17)

(18)

(19)

(20)

(21)

(22)

(23)

(24)

elsestop

本实验要求从键盘输入一个关系的关系矩阵,计算其自反闭包、对称闭包和传递闭包,计算传递闭包时使用Warshall算法。

3.实验步骤:

输入一个3*3维矩阵由r(R)=R∪IA;

s(R)=R∪R-1;

t(R)=R∪R2∪R3…列出的算法计算自反、对称、传递闭包并输出。

本实验源程序力求简洁易懂,所以在设计时应用简单的语句并省去了许多繁杂的选择,且每步均有注释,使程序更清晰。

/*

熟悉Warshall算法,掌握求关系的自反闭包、对称闭包和传递闭包的方法

令RAXA,则

r(R)=R∪IA

s(R)=R∪R-1

t(R)=R∪R2∪R3…

*/

inti,j,k;

intI[3][3]={1,0,0,0,1,0,0,0,1};

inta[3][3],b[3][3],c[3][3];

请输入3x3的二维矩阵:

for(i=0;

3;

i++)//输入矩阵

for(j=0;

j<

j++)

scanf("

a[i][j]);

自反闭包:

i++){//自反闭包

j++){

b[i][j]=a[i][j]||I[i][j];

printf("

%3d"

b[i][j]);

}

printf("

对称闭包:

i++){//对称闭包

c[i][j]=a[i][j]||a[j][i];

c[i][j]);

传递闭包:

i++){//传递闭包

if(a[j][i]==1)

for(k=0;

k<

k++)

a[j][k]=a[j][k]||a[i][k];

i++){//传递闭包的输出

a[i][j]);

实验三计算两结点间长度为m的路的数目

 

熟悉邻接矩阵和两结点间长度为m的路的数目的关系并编程计算。

定义7给定简单图G=<

V,E>

,V={v1,v2,…,vn},V中的结点按下标由小到大编序,则n阶方阵A=(aij)称为图G的邻接矩阵。

其中

i,j=1,2,…,n。

定理2设A为简单图G的邻接矩阵,则Am中的i行j列元素amij等于G中联结vi到vj的长度为m的链(或路)的数目。

本实验要求从键盘输入图的邻接矩阵和一正整数m,计算结点两两之间长度为m的路的数目。

考虑有向图和无向图。

本实验在编写源程序时,对实验要求进行了两种方式的阐释:

一种是输入关系矩阵及其阶数,然后依次列出路长度为1~n的关系矩阵;

另一种是输入关系矩阵及其阶数,然后指定路长度的关系矩阵。

本实验源程序力求简洁易懂,所以在设计时应用简单的语句并省去了许多繁杂的选择,且每步均有注释,使程序更清晰。

4.程序:

//计算两结点间长度为m的路的数目

intm,n,t;

inta[100][100],b[100][100];

intc[100][100];

ints;

请输入关系矩阵阶数:

m;

n=m;

请输入关系矩阵:

cin>

a[i][j];

/*************************************/"

b[i][j]=a[i][j];

长度为1的路的矩阵:

i++){//输出长度为1的路

cout<

b[i][j]<

"

;

for(t=0;

t<

n-1;

t++){//求长度为2~n的路

长度为"

t+2<

的路的矩阵:

for(i=0;

for(j=0;

s=0;

s+=a[i][k]*b[k][j];

c[i][j]=s;

}

i++)

b[i][j]=c[i][j];

i++){//输出长度为2~n的路

cout<

return0;

运行结果:

(2)方法二

请输入路的长度:

n;

n<

t++){//求长度为n的路

i++){//输出长度为n的路

5.运行结果:

实验四最优树的构造

熟悉最优树的构造算法,掌握最优树的构造过程。

定义8在权分别为w1,w2,…,wt的加权二叉树T中,若权是wi的叶结点,其级为L(wi),则

称为加权二叉树T的权,并记为w(T)。

已知w1,w2,…,wt为权,T0为加权二叉树,其权为w(T0),如果对任意加权二叉树T,它的权是w(T),均有w(T0)≤w(T),则称T0是最优树或Huffman树。

定理3设T为加权w1,w2,…,wt且w1≤w2≤…≤wt的最优树,则

(1)加权w1和w2的叶结点vw1和vw2是兄弟。

(2)以叶结点vw1和vw2为儿子的分枝结点,它是所有分枝结点的级最高者。

定理4设T为加权w1,w2,…,wt且w1≤w2≤…≤wt的最优树,若将以加权w1和w2的叶结点为儿子的分枝结点改为加权w1+w2的叶结点而得到一棵新树T1,则T1是最优树。

根据上述两个定理,求一棵有t个权的最优树,可简化为求一棵有t-1个权的最优树,而这又可简化为求一棵有t-2个权的最优树,依此类推。

具体作法是:

首先找出两个最小的权值,设w1和w2。

然后对t-1个权w1+w2,w3,…,wt求作一棵最优树,并且将这棵树中的结w1+w2代之以w1w2,依此类推。

本实验要求从键盘输入一组权值,构造出对应的最优树,列出构造过程。

本实验要求先输入叶子节点的个数,然后输入其权值,最后根据冒泡法排序并使最小的两数相加,最后输出最优树的构造过程。

//从键盘输入一组权值,构造出对应的最优树,列出构造过程

inti,j,k,temp,n;

intt=0;

inta[100];

请输入叶子节点个数:

输入一组权值:

cin>

a[i];

最优树构造过程:

i++)//输出该数组

a[i]<

for(k=0;

k++){

n-1-t;

i++){//冒泡法,共比较n-1-t轮

n-1-t-i;

j++)//依次将相邻两数比较

if(a[j]>

a[j+1]){

temp=a[j];

//若大数在前,则交换两数顺序

a[j]=a[j+1];

a[j+1]=temp;

}

a[0]=a[0]+a[1];

//将两个最小值相加并赋给a[0]

for(i=1;

n-t;

i++)//从a[2]开始将所有数向前移一位

a[i]=a[i+1];

i++)//输出数组

t++;

展开阅读全文
相关资源
猜你喜欢
相关搜索
资源标签

当前位置:首页 > 人文社科 > 文化宗教

copyright@ 2008-2022 冰豆网网站版权所有

经营许可证编号:鄂ICP备2022015515号-1