08-图论-离散数学讲义-海南大学(共十一讲)
- 格式:doc
- 大小:4.93 MB
- 文档页数:20
《离散数学》期末复习大纲一、数理逻辑[复习知识点]1、命题与联结词(否定¬、析取∨、合取∧、蕴涵→、等价↔),复合命题2、命题公式与赋值(成真、成假),真值表,公式类型(重言、矛盾、可满足),公式的基本等值式3、范式:析取范式、合取范式,极大(小)项,主析取范式、主合取范式4、公式类型的判别方法(真值表法、等值演算法、主析取/合取范式法)5、命题逻辑的推理理论6、谓词、量词、个体词(一阶逻辑3要素)、个体域、变元(约束出现与自由出现)7、命题符号化、谓词公式赋值与解释,谓词公式的类型(永真、永假、可满足)8、谓词公式的等值式(代换实例、消去量词、量词否定和量词辖域收与扩、量词分配)和置换规则(置换规则、换名规则)9、一阶逻辑前束范式(定义、求法)本章重点内容:命题与联结词、公式与解释、(主)析取范式与(主)合取范式、公式类型的判定、命题逻辑的推理、谓词与量词、命题符号化、谓词公式赋值与解释、求前束范式。
[复习要求]1、理解命题的概念;了解命题联结词的概念;理解用联结词产生复合命题的方法。
2、理解公式与赋值的概念;掌握求给定公式真值表的方法,用基本等值式化简其它公式,公式在解释下的真值。
3、了解析取(合取)范式的概念;理解极大(小)项的概念和主析取(合取)范式的概念;掌握用基本等值式或真值表将公式化为主析取(合取)范式的方法。
4、掌握利用真值表、等值演算法和主析取/合取范式的唯一性判别公式类型和公式等价方法。
5、掌握命题逻辑的推理理论。
6、理解谓词、量词、个体词、个体域、变元的概念;理解用谓词、量词、逻辑联结词描述一个简单命题;掌握命题的符号化。
7、理解公式与解释的概念;掌握在有限个体域下消去公式量词,求公式在给定解释下真值的方法;了解谓词公式的类型。
8、掌握求一阶逻辑前束范式的方法。
二、集合[复习知识点]1、集合、元素、集合的表示方法、子集、空集、全集、集合的包含、相等、幂集2、集合的交、并、差、补以及对称差等运算及有穷集的计数(文氏(Venn)图、包含排斥原理)3、集合恒等式(幂等律、交换律、结合律、分配律、吸收律、矛盾律、德摩根律等)及应用本章重点内容:集合的概念、集合的运算性质、集合恒等式的证明。
08-图论-离散数学讲义-海南大学(共十一讲) 8.图论 Topics in Graph Theory §8.1 图Graphs G= V={v1,v2,······,vn} 顶点vertex集。
E={ e | e=( vi, vj), vi,vj∈V, vi≠vj}无向边edge集。 γ(e)={ vi, vj}, e的端点end points集。
简写为G=(V,E)。
TD(vi)顶点vi的度数degree:连接到vi的边的条数。
连接一个顶点的圈loop算两度。 孤立点isolated vertex:度数为0的点。 两个顶点相邻adjacent:有一边相连。 定理1. (握手定理) TD=TD(vi)=2m.
推论. 任意图的奇数度顶点必有偶数多个。 完全图complete graph: 任意两点都相邻简单图。
定理2. n个顶点的完全图有n(n-1)/2条边。 正则图regular graph:每个顶点都有相同的度数。 E={|vi , vj∈V}有向边集 有向图 有向边 , vi起点弧尾, vj终点弧头 TD(vi):顶点的度degree: 以vi为端点的边的数目。 OD(vi): 出度, 以vi为起点的边的数目。 ID(vi): 入度,以vi为终点的边的数目。 TD(vi)= OD(vi)+ ID(vi) OD=ID, TD=2|E|,E| =1/2*TD TD OD ID 为整个图的总度,出度,入度数。
路径path: vi······vj, 以vi为起点vj为终点的顶点序列,相邻顶点相邻。 路径的长length: 路径上边的数目, 简单路径simple path:点都不重复的路径, 回路circuit : 首尾相接的路径, 简单回路simple circuit: 除起点和终点以外都不重复的路径, vivj连通connected: 有路径 vi······vj相连。 连通图: 任意两点都连通的图。 例
左图a,c,d,g是简单路径 右图a,d,b,c,e是简单路径。 f,e,a,d,b,a,f是简单回路。 f,e,d,c,e,f不是简单回路。
b f g d c e a f d c a e b 有向图 vivj强连通 vivj连通 vjvi也连通, 强连通图 任意两点都强连通。
子图和商图Subgraph and Quotient Graph G=(V, E), G’=(V’, E’) 如果 V’ V, E’ E , 就称 G’是G的子图subgraph。
G’的补图:G'=(V, E\E’), G的边集中去掉E’的边。 Ge=(V,E’), E’=E\{e}.
连通分量connected components: 一个图的极大连通子图。 一个图可以划分成几个不相交的连通分量。 强连通分量strong connected components: 一个有向图的极大强连通子图。 商图quotient graph R是V上等价关系, V/R={[v] | v∈V} E/R={([v], [w]) | [v], [w]中有相邻的顶点} GR=G/R=(V/R, E/R),称为G模R的商图。 把R相关的顶点粘合成一点,相关的边粘合成一边,就得到商图。
连通图的生成树spanning tree: 含有所有顶点的极小连通图. n个顶点连通图至少有n-1条边。 m条边的连通图去掉m-n+1条边可以得到生成树。 从连通图中如有回路,去掉回路中的一条边,继续直至没有回路,就得到生成树。 从m条边的连通图中得到生成树,要去掉m-n+1条边 T是连通图G的生成树,G的每一条不属于T的边e,叫弦。 m条边的连通图共有m-n+1条弦。
基本回路:每条弦加到T中得到一个回路,叫基本回路。 m条边的连通图共有m-n+1个基本回路。 割集:G的边集,去掉后G不连通。 一条边组成的割集叫桥bridge。 树的每条边都是桥。
基本割集:生成树T中每一条边,和G中对应于T的所有的弦,组成一个割集,叫基本割集。
最小生成树:权重最小的生成树。 带权的边:带边长的边。 带权的图:每边都带权。
Prim算法: 设 G=, 1. 令 U={v0}, T={ }.
2. 对任意u∈U, v∈V-U, (u,v)∈E, 找到权最小的边(u1,v1),
令U=U∪{v1}, T=T∪{(u1,v1)} 3. 重复2,直至U=V. 得到 T就是最小生成树。 T中共有n-1条边
CBEAFD6536452156CBEAFD6536
4
52156
U={A}, T={(A,C)}
U={A,C}, T={(A,C),(C,F)}
U={A,C,F}, T={(A,C),(C,F),(D,F)}
U={A,C,F,D}, T={(A,C),(C,F),(D,F),(B,C)}
U={A,C,F,D,B}, T={(A,C),(C,F),(D,F),(B,C),(B,E)}
U={A,C,F,D,B,E} CBEAFD6536
4
52156
(B,E)(B,C)(D,F)(C,F)(A,C)TE0BB 3 0D0F0F 2CC 4C 60C 5AA 5A 1A 60U FEDCBA
定义数组closeEdge[n]纪录每点到U的最短距离(点,距离)U中点距离为0,每加入一个新点,数组更新一次
templatestructMiniCostEdgeInfo{ Tadjvex;intlowcost;};
template intoperator<(MiniCostEdgeInfo a,MiniCostEdgeInfo b){return a.lowcost} template intminimum(MiniCostEdgeInfo *a, intn){ for(inti=0;iif(a[i].lowcost!=0) break;intmin=i;for(i=min+1;iif(a[i].lowcost!=0&&a[i]min=i;return min;}
templateTGetVertex(Graph G, intpos){ inti, n=G.NumberOfVertices( );if(pos<0||pos>=n){cerr<<"There are not so many vertices!";return 0; }VertexIterator liter(G);i = 0;while(!liter.EndOfList( ) &&i!= pos){ i++;liter.Next( ); }return liter.Data( );} templatevoid MiniSpanTreePrim(Graph< T> G){ intj,k,l,n=G.NumberOfVertices( );MiniCostEdgeInfo< T> * closeEdge;closeEdge=new MiniCostEdgeInfo< T>[n];Ts,w, v=GetVertex(G,0);closeEdge[0].lowcost=0;//起始点v0加进U
for(inti=1;i//初始化closeEdge数组
{ w=GetVertex(G,i); l=G.GetWeight(v,w);closeEdge[i].adjvex=v;if(l>0)closeEdge[i].lowcost=l;else closeEdge[i].lowcost=maxint;}
for( i=1;i//双重循环复杂度O(n2)与边数无关
{k=minimum(closeEdge,n);
//确定closeEdge中最小值v=closeEdge[k].adjvex;//取出这一边
w=GetVertex(G,k); l=closeEdge[k].lowcost;cout<<“\n” for(j=0;j//更新closeEdge { v=GetVertex(G,j); l=G.GetWeight(w,v);if(l>0&&l{ closeEdge[j].lowcost=l;closeEdge[j].adjvex=w; }} }}