离散数学学习总结

592 篇文章 8 订阅 ¥99.90 ¥299.90
280 篇文章 6 订阅
12 篇文章 0 订阅
本文是对离散数学的全面学习总结,涵盖了从命题逻辑和谓词逻辑,到集合、关系、函数、代数系统、群、格与布尔代数,以及图论的基本概念。重点讨论了命题逻辑推理理论,包括等值置换规则、重言代入、对偶原理和公式的范式。同时,深入探讨了集合上关系的判断方法。
摘要由CSDN通过智能技术生成

总结 离散数学知识点

http://blog.csdn.net/icepointline/article/details/37878441


第二章  命题逻辑


1.→,前键为真,后键为假才为假;<—>,相同为真,不同为假;
2.主析取范式:极小项(m)之和;主合取范式:极大项(M)之积;
3.求极小项时,命题变元的肯定为1,否定为0,求极大项时相反;
4.求极大极小项时,每个变元或变元的否定只能出现一次,求极小项时变元不够合取真,求极大项时变元不够析取假;
5.求范式时,为保证编码不错,命题变元最好按P,Q,R的顺序依次写;
6.真值表中值为1的项为极小项,值为0的项为极大项;
7.n个变元共有个极小项或极大项,这为(0~-1)刚好为化简完后的主析取加主合取;
8.永真式没有主合取范式,永假式没有主析取范式;
9.推证蕴含式的方法(=>):真值表法;分析法(假定前键为真推出后键为真,假定前键为假推出后键也为假)
10.命题逻辑的推理演算方法:P规则,T规则
 ①真值表法;②直接证法;③归谬法;④附加前提法;
 

第三章  谓词逻辑

1.一元谓词:谓词只有一个个体,一元谓词描述命题的性质;
  多元谓词:谓词有n个个体,多元谓词描述个体之间的关系;
2.全称量词用蕴含→,存在量词用合取^;
3.既有存在又有全称量词时,先消存在量词,再消全称量词;
 

第四章   集合

1.N,表示自然数集,1,2,3……,不包括0;
2.基:集合A中不同元素的个数,|A|;
3.幂集:给定集合A,以集合A的所有子集为元素组成的集合,P(A);
4.若集合A有n个元素,幂集P(A)有个元素,|P(A)|==;
5.集合的分划:(等价关系)
   ①每一个分划都是由集合A的几个子集构成的集合;
   ②这几个子集相交为空,相并为全(A);
6.集合的分划与覆盖的比较:
   分划:每个元素均应出现且仅出现一次在子集中;
   覆盖:只要求每个元素都出现,没有要求只出现一次;
 

第五章   关系

1.若集合A有m个元素,集合B有n个元素,则笛卡尔A×B的基数为mn,A到B上可以定义种不同的关系;
2.若集合A有n个元素,则|A×A|=,A上有个不同的关系;
3.全关系的性质:自反性,对称性,传递性;
  空关系的性质:反自反性,反对称性,传递性;
  全封闭环的性质:自反性,对称性,反对称性,传递性;
4.前域(domR):所有元素x组成的集合;
  后域(ranR):所有元素y组成的集合;
5.自反闭包:r(R)=RU;
  对称闭包:s(R)=RU;
  传递闭包:t(R)=RUUU……
6.等价关系:集合A上的二元关系R满足自反性,对称性和传递性,则R称为等价关系;
7.偏序关系:集合A上的关系R满足自反性,反对称性和传递性,则称R是A上的一个偏序关系;
8.covA={<x,y>|x,y属于A,y盖住x};
9.极小元:集合A中没有比它更小的元素(若存在可能不唯一);
  极大元:集合A中没有比它更大的元素(若存在可能不唯一);
  最小元:比集合A中任何其他元素都小(若存在就一定唯一);
  最大元:比集合A中任何其他元素都大(若存在就一定唯一);
10.前提:B是A的子集
   上界:A中的某个元素比B中任意元素都大,称这个元素是B的上界(若存在,可能不唯一);
   下界:A中的某个元素比B中任意元素都小,称这个元素是B的下界(若存在,可能不唯一);
   上确界:最小的上界(若存在就一定唯一);
   下确界:最大的下界(若存在就一定唯一);


第六章   函数

1.若|X|=m,|Y|=n,则从X到Y有种不同的关系,有种不同的函数;
2.在一个有n个元素的集合上,可以有种不同的关系,有种不同的函数,有n!种不同的双射;
3.若|X|=m,|Y|=n,且m<=n,则从X到Y有种不同的单射;
4.单射:f:X-Y,对任意,属于X,且≠,若f()≠f();
  满射:f:X-Y,对值域中任意一个元素y在前域中都有一个或多个元素对应;
  双射:f:X-Y,若f既是单射又是满射,则f是双射;
5.复合函数:fºg=g(f(x));
6.设函数f:A-B,g:B-C,那么
  ①如果f,g都是单射,则fºg也是单射;
  ②如果f,g都是满射,则fºg也是满射;
  ③如果f,g都是双射,则fºg也是双射;
  ④如果fºg是双射,则f是单射,g是满射;
 

第七章   代数系统

1.二元运算:集合A上的二元运算就是到A的映射;
2. 集合A上可定义的二元运算个数就是从A×A到A上的映射的个数,即从从A×A到A上函数的个数,若|A|=2,则集合A上的二元运算的个数为==16种;
3. 判断二元运算的性质方法:
①封闭性:运算表内只有所给元素;
②交换律:主对角线两边元素对称相等;
③幂等律:主对角线上每个元素与所在行列表头元素相同;
④有幺元:元素所对应的行和列的元素依次与运算表的行和列相同;
⑤有零元:元素所对应的行和列的元素都与该元素相同;
4.同态映射:<A,*>,<B,^>,满足f(a*b)=f(a)^f(b),则f为由<A,*>到<B,^>的同态映射;若f是双射,则称为同构;
 

第八章   群

1.广群的性质:封闭性;
  半群的性质:封闭性,结合律;
  含幺半群(独异点):封闭性,结合律,有幺元;
  群的性质:封闭性,结合律,有幺元,有逆元;
2.群没有零元;
3.阿贝尔群(交换群):封闭性,结合律,有幺元,有逆元,交换律;
4.循环群中幺元不能是生成元;
5.任何一个循环群必定是阿贝尔群;
 

第十章    格与布尔代数

1.格:偏序集合A中任意两个元素都有上、下确界;
2.格的基本性质:
 1)  自反性
        a≤a   对偶: a≥a
 2)  反对称性
        a≤b ^ b≥a  => a=b
        对偶:a≥b ^ b≤a  => a=b
 3)  传递性
        a≤b ^ b≤c  =>  a≤c
        对偶:a≥b ^ b≥c  =>  a≥c 
 4) 最大下界描述之一
        a^b≤a   对偶 avb≥a
        A^b≤b   对偶 avb≥b
 5)最大下界描述之二
        c≤a,c≤b  =>  c≤a^b
        对偶c≥a,c≥b  =>Þc≥avb   
 6)  结合律
      a^(b^c)=(a^b)^c 
      对偶 av(bvc)=(avb)vc   
 7)   等幂律
      a^a=a   对偶  ava=a
  8)  吸收律
      a^(avb)=a  对偶  av(a^b)=a
  9)    a≤b <=>  a^b=a    avb=b
 10)  a≤c,b≤d  =>  a^b≤c^d   avb≤cvd
 11)  保序性
      b≤c  =>  a^b≤a^c  avb≤avc
 12) 分配不等式
     av(b^c)≤(avb)^(avc)
  对偶  a^(bvc)≥(a^b)v(a^c)
 13)模不等式
       a≤c  <=>Û  av(b^c)≤(avb)^c
3.分配格:满足a^(bvc)=(a^b)v(a^c)和av(b^c)=(avb)^(avc);
4.分配格的充要条件:该格没有任何子格与钻石格或五环格同构;
5.链格一定是分配格,分配格必定是模格;
6.全上界:集合A中的某个元素a大于等于该集合中的任何元素,则称a为格<A,<=>的全上界,记为1;(若存在则唯一)
  全下界:集合A中的某个元素b小于等于该集合中的任何元素,则称b为格<A,<=>的全下界,记为0;(若存在则唯一)
7.有界格:有全上界和全下界的格称为有界格,即有0和1的格;
8.补元:在有界格内,如果a^b=0,avb=1,则a和b互为补元;
9.有补格:在有界格内,每个元素都至少有一个补元;
10.有补分配格(布尔格):既是有补格,又是分配格;
11.布尔代数:一个有补分配格称为布尔代数;
 

第十一章    图论

1.邻接:两点之间有边连接,则点与点邻接;
2.关联:两点之间有边连接,则这两点与边关联;
3.平凡图:只有一个孤立点构成的图;
4.简单图:不含平行边和环的图;
5.无向完全图:n个节点任意两个节点之间都有边相连的简单无向图;
  有向完全图:n个节点任意两个节点之间都有边相连的简单有向图;
6.无向完全图有n(n-1)/2条边,有向完全图有n(n-1)条边;
7.r-正则图:每个节点度数均为r的图;
8.握手定理:节点度数的总和等于边的两倍;
9.任何图中,度数为奇数的节点个数必定是偶数个;
10.任何有向图中,所有节点入度之和等于所有节点的出度之和;
11.每个节点的度数至少为2的图必定包含一条回路;
12.可达:对于图中的两个节点,,若存在连接到的路,则称与相互可达,也称与是连通的;在有向图中,若存在到的路,则称到可达;
13.强连通:有向图章任意两节点相互可达;
   单向连通:图中两节点至少有一个方向可达;
  弱连通:无向图的连通;(弱连通必定是单向连通)
14.点割集:删去图中的某些点后所得的子图不连通了,如果删去其他几个点后子图之间仍是连通的,则这些点组成的集合称为点割集;
   割点:如果一个点构成点割集,即删去图中的一个点后所得子图是不连通的,则该点称为割点;
15.关联矩阵:M(G),是与关联的次数,节点为行,边为列;
   无向图:点与边无关系关联数为0,有关系为1,有环为2;
   有向图:点与边无关系关联数为0,有关系起点为1终点为-1,
   关联矩阵的特点:
无向图:
    ①行:每个节点关联的边,即节点的度;
    ②列:每条边关联的节点;
有向图:  
③所有的入度(1)=所有的出度(0);
16.邻接矩阵:A(G),是邻接到的边的数目,点为行,点为列;
17.可达矩阵:P(G),至少存在一条回路的矩阵,点为行,点为列;
    P(G)=A(G)+(G)+(G)+(G)
   可达矩阵的特点:表明图中任意两节点之间是否至少存在一条路,以及在任何节点上是否存在回路;
    A(G)中所有数的和:表示图中路径长度为1的通路条数;
   (G)中所有数的和:表示图中路径长度为2的通路条数;
   (G)中所有数的和:表示图中路径长度为3的通路条数;
   (G)中所有数的和:表示图中路径长度为4的通路条数;
P(G)中主对角线所有数的和:表示图中的回路条数;
18.布尔矩阵:B(G),到有路为1,无路则为0,点为行,点为列;
19.代价矩阵:邻接矩阵元素为1的用权值表示,为0的用无穷大表示,节点自身到自身的权值为0;
20.生成树:只访问每个节点一次,经过的节点和边构成的子图;
21.构造生成树的两种方法:深度优先;广度优先;
   深度优先:
             ①选定起始点;
             ②选择一个与邻接且未被访问过的节点;
             ③从出发按邻接方向继续访问,当遇到一个节点所有邻接点均已被访问时,回到该节点的前一个点,再寻求未被访问过的邻接点,直到所有节点都被访问过一次;
广度优先:
          ①选定起始点;
          ②访问与邻接的所有节点,,……,,这些作为第一层节点;
          ③在第一层节点中选定一个节点为起点;
              ④重复②③,直到所有节点都被访问过一次;
22.最小生成树:具有最小权值(T)的生成树;
23.构造最小生成树的三种方法:
      克鲁斯卡尔方法;管梅谷算法;普利姆算法;
   (1)克鲁斯卡尔方法
     ①将所有权值按从小到大排列;
     ②先画权值最小的边,然后去掉其边值;重新按小到大排序;
     ③再画权值最小的边,若最小的边有几条相同的,选择时要满足不能出现回路,然后去掉其边值;重新按小到大排序;
     ④重复③,直到所有节点都被访问过一次;
   (2)管梅谷算法(破圈法)
     ①在图中取一回路,去掉回路中最大权值的边得一子图;
     ②在子图中再取一回路,去掉回路中最大权值的边再得一子图;
     ③重复②,直到所有节点都被访问过一次;
   (3)普利姆算法
 ①在图中任取一点为起点,连接边值最小的邻接点;
 ②以邻接点为起点,找到邻接的最小边值,如果最小边值比邻接的所有边值都小(除已连接的边值),直接连接,否则退回,连接现在的最小边值(除已连接的边值);
 ③重复操作,直到所有节点都被访问过一次;
24.关键路径
例2 求PERT图中各顶点的最早完成时间, 最晚完成时间, 缓冲时间及关键路径.
解:最早完成时间
     TE(v1)=0
     TE(v2)=max{0+1}=1
     TE(v3)=max{0+2,1+0}=2
     TE(v4)=max{0+3,2+2}=4
     TE(v5)=max{1+3,4+4}=8
     TE(v6)=max{2+4,8+1}=9
     TE(v7)=max{1+4,2+4}=6
     TE(v8)=max{9+1,6+6}=12
最晚完成时间
   TL(v8)=12
   TL(v7)=min{12-6}=6
   TL(v6)=min{12-1}=11
   TL(v5)=min{11-1}=10
   TL(v4)=min{10-4}=6
   TL(v3)=min{6-2,11-4,6-4}=2
   TL(v2)=min{2-0,10-3,6-4}=2
   TL(v1)=min{2-1,2-2,6-3}=0
缓冲时间
   TS(v1)=0-0=0
   TS(v2)=2-1=1
   TS(v3)=2-2=0
   TS(v4)=6-4=2
   TS(v5=10-8=2
   TS(v6)=11-9=2
   TS(v7)=6-6=0
   TS(v8)=12-12=0
关键路径:  v1-v3-v7-v8
 
25.欧拉路:经过图中每条边一次且仅一次的通路;
   欧拉回路:经过图中每条边一次且仅一次的回路;
   欧拉图:具有欧拉回路的图;
   单向欧拉路:经过有向图中每条边一次且仅一次的单向路;
   欧拉单向回路:经过有向图中每条边一次且仅一次的单向回路;
26.(1)无向图中存在欧拉路的充要条件:
    ①连通图;②有0个或2个奇数度节点;
   (2)无向图中存在欧拉回路的充要条件:
    ①连通图;②所有节点度数均为偶数;
   (3)连通有向图含有单向欧拉路的充要条件:
①除两个节点外,每个节点入度=出度;
②这两个节点中,一个节点的入度比出度多1,另一个节点的入;度比出度少1;
(4)连通有向图含有单向欧拉回路的充要条件:
         图中每个节点的出度=入度;
27.哈密顿路:经过图中每个节点一次且仅一次的通路;
   哈密顿回路:经过图中每个节点一次且仅一次的回路;
   哈密顿图:具有哈密顿回路的图;
28.判定哈密顿图(没有充要条件)
  必要条件:
  任意去掉图中n个节点及关联的边后,得到的分图数目小于等于n;
  充分条件:
  图中每一对节点的度数之和都大于等于图中的总节点数;
29.哈密顿图的应用:安排圆桌会议;
   方法:将每一个人看做一个节点,将每个人与和他能交流的人连接,找到一条经过每个节点一次且仅一次的回路(哈密顿图),即可;
30.平面图:将图形的交叉边进行改造后,不会出现边的交叉,则是平面图;
31.面次:面的边界回路长度称为该面的次;
32.一个有限平面图,面的次数之和等于其边数的两倍;
33.欧拉定理:假设一个连通平面图有v个节点,e条边,r个面,则
   v-e+r=2;
34.判断是平面图的必要条件:(若不满足,就一定不是平面图)
  设图G是v个节点,e条边的简单连通平面图,若v>=3,则e<=3v-6;
35.同胚:对于两个图G1,G2,如果它们是同构的,或者通过反复插入和除去2度节点可以变成同构的图,则称G1,G2是同胚的;
36.判断G是平面图的充要条件:
        图G不含同胚于K3.3或K5的子图;
37.二部图:①无向图的节点集合可以划分为两个子集V1,V2;
           ②图中每条边的一个端点在V1,另一个则在V2中;
   完全二部图:二部图中V1的每个节点都与V2的每个节点邻接;
   判定无向图G为二部图的充要条件:
          图中每条回路经过边的条数均为偶数;
38.树:具有n个顶点n-1条边的无回路连通无向图;
39.节点的层数:从树根到该节点经过的边的条数;
40.树高:层数最大的顶点的层数;
41.二叉树:
    ①二叉树额基本结构状态有5种;
    ②二叉树内节点的度数只考虑出度,不考虑入度;
    ③二叉树内树叶的节点度数为0,而树内树叶节点度数为1;
    ④二叉树内节点的度数=边的总数(只算出度);握手定理“节点数=边的两倍”是在同时计算入度和出度的时成立;
    ⑤二叉树内节点的总数=边的总数+1;
    ⑥位于二叉树第k层上的节点,最多有个(k>=1);
    ⑦深度为k的二叉树的节点总数最多为-1个,最少k个(k>=1);
    ⑧如果有个叶子,个2度节点,则=+1;
 42.二叉树的节点遍历方法: 
         先根顺序(DLR);
         中根顺序(LDR);
         后根顺序(LRD); 
43.哈夫曼树:用哈夫曼算法构造的最优二叉树;
44.最优二叉树的构造方法: 
       ①将给定的权值按从小到大排序;
       ②取两个最小值分支点的左右子树(左小右大),去掉已选的这两个权值,并将这两个最小值加起来作为下一轮排序的权值;
       ③重复②,直达所有权值构造完毕;
45.哈夫曼编码:在最优二叉树上,按照左0右1的规则,用0和1代替所有边的权值;
  每个节点的编码:从根到该节点经过的0和1组成的一排编码;
========

范式和命题逻辑推理理论

http://www.cnblogs.com/zrui513/p/4824174.html

1、命题公式的等值置换规则(等价变形,化简)

 合式公式的子式:如果合式公式A的一个子串X也是合式公式,那称X是A的一个子式。

 置换规则:设X是合式公式A的一个子式,Y是一个合式公式且Y<=>X,则将A中的子式中的X换成Y,生成的新的式子B,仍为一个合式公式且B<=>A。 

 用递等式简化证明的书写。

在连续蕴含的式子里面,前提的换位并不影响最后的结构。例:

 等值演算用于逻辑含义的化简

 也可以化简与门或门电路

 2、命题公式的重言代入规则

 重言代入规则:设A为重言式,p为其中任一原子变量,则将A中p处处替换为另一合式公式B,得到的新的公式A`仍为重言式,合式公式。

在变量表的任一解释下,B的计算真值视为对p的一个真值指派,而A的重言性与p的真值指派无关。

 重言代入规则和等值置换规则的区别:

1、重言代入规则的应用前提,公式必须是重言式

2、被替换的对象:必须是原子变量,而不是复合形式

3、替换的对象:可以是随意的合式公式,不必符合等值条件。

4、重言代入必须处处带入。

3、命题逻辑公式的对偶

对偶变化是一个基本的变形。

对偶的定义:

联接词否定,合取和析取可以构成功能完备集,所以定义中的假设是合理的。

基本上是把合取词换成析取词。否定词不参与。这里的等号表示公式A的构造形态,合式公式的描述。

定理1:对偶的对偶就是自己

定理2:

定理3:数学归纳法证明。

定理4:对偶规则一

有关否定词的深入, 

定理5:对偶规则二

4、命题逻辑公式的范式和主范式

本节通过等值演算将命题公式等值地化成联结词集中两种规范的形式,即主析取范式与主合取范式。这种规范形式能给出公式的真值表所给出的一切信息。

文字:原子命题(命题变项)及其否定式统称为文字(形)  例如,对变量表{p,q},q,p,都是文字

把F称为空文字,记作NIL。

范式的一些基本定义

基本积:由有限个文字的合取构成 (简单合取式)  合取成积了。

基本和:由有限个文字的析取构成 (简单析取式)  析取成和了。

1个文字析取,2个文字析取,3个文字析取。

定理6、

(1)一个基本和是永真的当且仅当其中含有某个原子的互补对

(2)一个基本积是矛盾的当且仅当其中含有某个原子的互补对

析取范式:一个命题公式称为是一个析取范式当且仅当其具有形式,其中Ai(i>=1  && i<= n )是基本积.

合取范式:一个命题公式称为是一个合取范式当且仅当其具有形式,其中Ai(i>=1  && i<= n )是基本和.

n的取值范围可以是无穷大。

定理7、

一个合取范式是永真的当且仅当其中含有的基本和都是永真的。 

一个析取范式是矛盾的当且仅当其中含有的基本积都是矛盾的

定理8、(范式存在基本定理)

范式存在基本定理:任何一个命题都有与之等值的析取范式和合取范式

这个证明的证明方法是构造性证明,以求合取范型为例,重复施行如下的等值变形:

联结词化归:消去←→
否定词深入:应用德-摩根律,使否定词直接作用于原子命题变量
重复利用 V ^ 之间的分配率求的析取范式或合取范式。当我们求合取范型,我们用的是析取对合取的分配率。

最后两行的公式是相同的,而且都是合取范式,可见一个命题公式的合取(析取)范式不是唯一的,所以我们要规定特例来约束得到主范式。

极小项(布尔积)

一个极小项就是合取泛型。有很多命题变项。极小项是合取。

极小项的基本性质,每个命题变项和他的否定式不同时出现,而两者之一必出现且仅出现一次,所以极小项有2n个

一个极小项是1,其他全为0.

极大项(布尔和)
基本上就是所有极大项中,一个是0,其他都为1。

主析取式
若由n个命题变项构成的析取范式中所有的简单合取式都是极小项,则称该析取范式为主析取范式

定理9、(主析取方式和唯一性定理)

任一命题公式都有与之等值的主析取范式和主合取范式,考虑到在交换律下等值的公式形态的同一性,主范式的形态是唯一的。

若由n个命题变项构成的合取范式中所有的简单析取式都是极大项,则称该合取范式为主合取范式

例子

首先我们构建真值表

写出fa fb fc的主析取方式。

例二

等值演算构造主析取范式
当命题变量的数目比较大的时候,就不能用真值表了。

1、构造析取范式并化简合并

2、在每一个基本积中利用同一律填满所有的原子命题文字形式,利用分配率构造布尔积(称为基本积的扩展)

3、重复第二步知道所有基本积扩展成布尔积

4、合并同类布尔积,经适当排序得到最后结果。

主范式的编码
定义:极小项的成真编码。

定义:极大项的成假编码

极小项和极大项的代数编码

 主范式的应用:

1、判断不同公式的等值性。

2、判断公式的重言性,可满足行和矛盾性。

3、给出公式的成真复制和成假赋值。

命题逻辑推理理论 
========

离散数学之集合上关系的判断


西瓜的博客
http://blog.csdn.net/u011613367/article/details/51286301

这次实验由于自己这周遇到了太多了的事情所以没有认真的完成,但还是把代码拿出来和大家分享分享

这周太挫败了

1.acm校赛没能拿奖(这点对我打击太大了,不过我这样的人总是当时心情不爽,过了几天也就好了)

2.linux误删两个文件系统崩溃,重装了系统

3.写了一年的代码放在了移动硬盘里,结果被我摔坏了(由于重装系统的原因,代码电脑里没有。。。一年的代码。。。)

不过从中学到了许多面对事情的态度和方法,感觉这是我大学学到的东西最多的一天。

PS:由于换成了linux系统,这份代码是在linux写的(貌似和windows没啥区别啊)但上机提交时打开正常,运行时cmd中文都是乱码(都是utf-8编码)。。。不懂为什么

下面是我在网上找到的方法

在中文Windows系统中,如果一个文本文件是UTF-8编码的,那么在CMD.exe命令行窗口(所谓的DOS窗口)中不能正确显示文件中的内容。在默认情况下,命令行窗口中使用的代码页是中文或者美国的,即编码是中文字符集或者西文字符集。 
如果想正确显示UTF-8字符,可以按照以下步骤操作: 
1、打开CMD.exe命令行窗口 
2、通过 chcp命令改变代码页,UTF-8的代码页为65001 
chcp 65001 

执行该操作后,代码页就被变成UTF-8了。但是,在窗口中仍旧不能正确显示UTF-8字符。 
3、修改窗口属性,改变字体 
在命令行标题栏上点击右键,选择"属性"->"字体",将字体修改为True Type字体"Lucida Console",然后点击确定将属性应用到当前窗口。 
这时使用type命令就可以显示UTF-8文本文件的内容了: 
type filename.txt 
4、通过以上操作并不能完全解决问题,因为显示出来的内容有可能不完全。可以先最小化,然后最大化命令行窗口,文件的内容就完整的显示出来了。

#include <iostream>  
#include <cstdio>  
#include <cstring>  
#include <algorithm>  
using namespace std;  
int a[10][10];  
int a1, a2, Max=1;  
char c1, c2;  
void menu();  
void input();  
void output();  
void jude();  
void jude_Reflexivity();  
void jude_Symmetry();  
void jude_Transitive();  
void jude_Antisymmetry();  
void jude_Irreflexivity();  
int  main()  
{  
    menu();  
      input();  
      output();  
      jude();  
    return 0;  
}  
  
void menu()  
{  
    cout<<"\t\t\t"<<"离散数学之二元性质判定"<<endl;  
    cout<<"1.集合元素依次为a,b,c,d,e"<<endl;  
    cout<<"2.每行输入两个字母代表关系的一个元素,以0 0作为输入输入结束标记"<<endl;  
}  
  
void input()  
{  
    memset(a, 0, sizeof(a));  
    while(scanf("%c %c", &c1, &c2)!=EOF)  
    {  
        getchar();  
        if(c1=='0'&&c2=='0')  
            break;  
        a1=c1-96;  
        a2=c2-96;  
        a[a1][a2]=1;  
        Max=max(max(a1, a2), Max);  
    }  
}  
  
void output()  
{  
    cout<<"关系矩阵为:"<<endl;  
    for(int i=1;i<=Max;i++)  
    {  
        for(int j=1;j<=Max;j++)  
            cout<<a[i][j]<<" ";  
        cout<<endl;  
    }  
    cout<<endl;  
  
}  
  
void jude()  
{  
    jude_Reflexivity();  
    cout<<endl;  
    jude_Symmetry();  
    cout<<endl;  
    jude_Transitive();  
    cout<<endl;  
    jude_Antisymmetry();  
    cout<<endl;  
    jude_Irreflexivity();  
    cout<<endl;  
  
}  
  
void jude_Reflexivity()  
{  
    cout<<"1.自反性判断"<<endl;  
    bool flag=true;  
    int Case=0;  
    for(int i=1, j=1;i<=Max;i++, j++)  
    {  
        if(a[i][j]==0)  
        {  
            printf("第%d组反例:%c %c\n", ++Case, i+96, j+96);  
            flag=false;  
        }  
    }  
    if(flag)  
        cout<<"该关系满足自反性"<<endl;  
}  
  
void jude_Symmetry()  
{  
    cout<<"2.对称性判断"<<endl;  
    bool flag=true;  
    int Case=0;  
    for(int i=1;i<=Max;i++)  
    {  
        for(int j=1;j<=Max;j++)  
        {  
            if(i>=j)  
                continue;  
            if(a[i][j]!=a[j][i])  
            {  
                printf("第%d组反例:\n%c %c\n%c %c\n",++Case, i+96, j+96, j+96, i+96);  
                flag=false;  
            }  
        }  
    }  
    if(flag)  
        cout<<"该关系满足对称性"<<endl;  
}  


void jude_Transitive()  
{  
    cout<<"3.传递性判断"<<endl;  
    bool flag=true;  
    int Case=0;  
    for(int i=1;i<=Max;i++)  
    {  
        for(int j=1;j<=Max;j++)  
        {  
            for(int k=1;k<=Max;k++)  
                if(a[i][j]&&a[j][k]&&!a[i][k])  
                {  
                    printf("第%d组反例:\n%c %c\n%c %c\n",++Case, i+96, j+96, j+96, k+96);  
                    flag=false;  
                }  
        }  
    }  
    if(flag)  
        cout<<"该关系满足传递性"<<endl;  
}  
  
void jude_Antisymmetry()  
{  
    cout<<"4.反对称性判断"<<endl;  
    bool flag=true;  
    int Case=0;  
    for(int i=1;i<=Max;i++)  
    {  
        for(int j=1;j<=Max;j++)  
        {  
            if(i>=j)  
                continue;  
            if(a[i][j]&&a[j][i])  
            {  
                printf("第%d组反例:\n%c %c\n%c %c\n",++Case, i+96, j+96, j+96, i+96);  
                flag=false;  
            }  
        }  
    }  
    if(flag)  
        cout<<"该关系满足反对称性"<<endl;  
}  
  
void jude_Irreflexivity()  
{  
    cout<<"5.反自反性判断"<<endl;  
    bool flag=true;  
    int Case=0;  
    for(int i=1, j=1;i<=Max;i++, j++)  
    {  
        if(a[i][j]==1)  
        {  
            printf("第%d组反例:%c %c\n", ++Case, i+96, j+96);  
            flag=false;  
        }  
    }  
    if(flag)  
        cout<<"该关系满足反自反性"<<endl;  
}  

========
  • 19
    点赞
  • 86
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值