离散作业河北工业大学文档格式.docx
《离散作业河北工业大学文档格式.docx》由会员分享,可在线阅读,更多相关《离散作业河北工业大学文档格式.docx(14页珍藏版)》请在冰豆网上搜索。
在输入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++;