《离散数学2》复习笔记
应asuldb要求,把这篇写一下。还是博客笔记写起来比较快乐!
一 基本概念
1 图的基本概念
V表示图的顶点集合,E表示图的边集合。本书只讨论有限图,即VE均为有限集的情况。|V|=n,|E|=m.
边分为有向边和无向边,有向边也叫弧。$e_k=(v_i,v_j)$,称 $v_i,v_j$ 为相邻结点。
全是有向边的称为有向图,全为无向边的称为无向图,否则称为混合图。含有重边的图也称为多重图。
结点v相连的边数称为该结点的度,记为 $d(v)$ ,注意自环对度数的贡献是2。
对于无向图,如果任意两结点间最多只有一条边,且不存在自环,称为简单图。
没有边的简单图称为空图,记为 $N_n$;任意两结点间都有边的简单图称为完全图,记为 $K_n$,其中每个点的度数均为 $n-1$ 。
一些性质:
- $\sum d(v_i)=2m$
- 度数为奇数的结点必为偶数个
- 有向图中,正度之和=负度之和
- 非空简单图中一定存在度数相同的结点
如果每条边带有一个权值,则称G为赋权图,如果权值全为正数,则为正权图。
$V'\subseteq V,E'\subseteq E$ ,则G'=(V',E')为G=(V,E)的一个子图。如果V'=V,则G'称为G的支撑子图或导出子图。
如果 $V' \subseteq V$ 且E'包含了G在结点子集V'之间的所有边,则称G'为G的导出子图。
两个图的并:点集取并,边集取并;
两个图的交:点集取交,边集取交;
两个图的对称差:点集取并,边集取对称差(即保留那些恰好在一张图中出现的边)
在G中删去一个子图H,指删去H中的各条边,记做G-H。特别地,对于简单图G,称 $K_n-G$ 为G的补图,记做$\overline G$.
G-v:指从G中删去结点v以及和结点v相连的边。
无向图的邻点集$\Gamma(x)$:所有与x直接相连的点的集合。
有向图的直接后继集/外邻集:$\Gamma^+(x)=\{u|(x,u)\in E\}$
有向图的直接前趋集/内邻集:$\Gamma^-(x)=\{u|(u,x)\in E\}$
图的同构:两个图通过重标号结点后完全相同,则这两个图同构。记做 $G_1 \cong G_2$
同构图的性质:
- 点数边数相同
- 结点度的非增序列相同(把所有结点的度写出来,排序后相同)
- 存在同构的导出子图(可以用来反证,若存在某个G1中的子图,无法在G2中找到同构的子图,则两图不同构)
2 图的代数表示
邻接矩阵:一个矩阵,a(i,j)=[ij间有边];无向图的邻接矩阵是对称的。
权矩阵:w(i,j)=ij间的边权;
关联矩阵:有点怪,但这本教材特别喜欢用。用一个n行m列的矩阵来表示图。设 $e_i=(u_i,v_i)$,那么在i列的 $u_i,v_i$ 位置分别写上1,-1。因此每列只有两个非零元,每行的非零元个数等于这个点的度数。对于无向图,可以在两个端点的位置均写上1;
边列表:将每条边的两个端点和权值列出来;
正向表:记录每个结点的直接后继。书中的方法类似把若干数组连缀起来,如:1的后继有24,2的后继有13,3的后继有4,4的后继有2.那就先开一个数组记录每个点有几个后继,相当于索引:2,2,1,1;然后用一个大数组记录所有后继:241342.
逆向表:和正向表类似,但要改成记录前驱;
邻接表:对每个结点,开一个链表存它的后继。
二 道路与回路
1 道路与回路
按照第一章的方法整理就整理不完了!所以之后会摸一点。
如果一条道路的起点=终点,则称为圈(回路)。
没有重复边的道路和回路称为简单道路、回路。没有重复点的称为初级道路、回路。
弦:若C是简单图G中结点大于3的一个初级回路,x,y在C中不相邻,而(x,y)是G中的一条边,则称(x,y)是C的一条弦。
弦的存在性:若G中每个结点的度数均>=3,则G中必含带弦的回路。
连通图:任意两点间均存在道路。
连通支:极大连通子图。
2 道路与回路的判定
设A是G的邻接矩阵,则$A^k_{i,j}$表示了i能否通过k条边到达j。显然,如果两个结点连通,则它们间必然存在<=n个点的道路。
Warshall算法:三重循环,最外层循环中转点k,之后g[i][j]|=(g[i][k]&g[k][j]);可以求出图中任意两点的连通性。
也可以使用BFS、DFS来求两点间有无通路,复杂度O(m).
3 欧拉道路与回路
经过所有边恰好一次的简单回路(道路)称为G的欧拉回路(道路)。
存在欧拉回路 $\iff$ 图连通,且每个点的度数均为偶数。
求欧拉回路的方法:dfs,每找到一个回路后,在G中删去这些边,再找,并把新找到的回路(通过公共结点)连到原回路中去。
存在欧拉道路 $\iff$ 图连通,且至多有两个度数为奇的点
有向图:若有向图连通,且每个点入度=出度,则存在有向欧拉回路。
4 哈密顿道路和回路
无向图的一条经过所有结点恰好一次的初级回路(道路)称为哈密顿回路(道路),简称H回路(道路)。
性质:完全图中存在H回路。
定理1:若简单图G的任意两结点间均有d(x)+d(y)>=n-1,则存在哈密顿道路。证明:首先G是连通图,取一条极长道路(无法再扩充),若长度<n,则一定存在包含这条道路的回路,换个地方断开就可以再扩充了。
定理2:若简单图G的任意两结点间均有d(x)+d(y)>=n,则存在哈密顿回路。
闭合图引理:若x,y在G中不相邻,且d(x)+d(y)>=n,设G'=G+(x,y),则G存在H回路当且仅当G'存在H回路。
闭合图:在G中找出不相邻的xy,且d(x)+d(y)>=n,则加入新边(x,y).(此时应更新图的度数)不断增加新边,直到不存在这样的点对。得到的新图称为G的闭合图,记做C(G)。
简单图的闭合图是唯一的,不因加边顺序而发生改变。
5 旅行商问题
求最优的H回路。
分支与界法:其实就是剪枝dfs啦。首先将所有的边权排序,选取前n条边试一试能否构成H回路,然后dfs就可以了。与界是指:看一下当前的dfs序列,如果第x大选取第i大的边,x+1~n顺序选取i+1,i+2……的边,得到的答案已经比之前搜到的答案劣,则直接退出这个分支;如果一条边加入后,使某个点的度数>2,那这次就不应该选这条边。注意:第一次得到的答案不一定是最优的!(其实就是最普通的剪枝,但是做作业的时候迷糊了)如何判断合法:所有点的度数都为2且连通即可构成H回路。
便宜算法:就是贪心。逐步加入离“当前结果集合”最近的点即可。如当前的结果序列已经有了1、2两个点,发现5离2的距离是当前所剩边权中最小的,就把5插入结果序列。关于5插到2的左边还是右边?接着贪心即可。这是一个近似算法,不过效果还不错。(如果边权满足三角不等式,那便宜出来的解不会大于正解的两倍!)
6 最短路径
正权图,s到各点的最短路径:Dijkstra算法;
边权均为1时,s到各点的最短路径:bfs;
边权任意时:Ford算法(也可以SPFA);区别是:Dijkstra一旦算出某个点的最短路就不会更改,而ford算法可能需要多次更新某个点的最短路。
7 关键路径
PT图:用结点表示工序,边表示依赖关系,权值写在点上。(DAG)
关键路径:在最长路上的工序是不能延误的,而其他工序或许晚一点做也问题不大。
设t(x)表示x这个工序最早可以什么时候开始(即从起点到x的最长路),u(x)表示x这个工序最晚需要什么时候做完(即从x到终点的最长路),那么x可以延误的时间就是u(x)-t(x)-cost(x).即最晚减最早,再减去这个工序本身花费的时间。
PERT图:抽象!大家都不太完全理解的奇怪东西。用边来表示工序,点来表示依赖关系(如果y工序需要在x工序做完后再做,就让x指向一个点t,y从t指出)这个主要适合于这样多对多的情况“3,5,7工序均依赖于1,2,4”,可以少画几条边。但如果有的工序依赖1,有的工序依赖1、2,这种情况就比较emm。对此,助教的评价是:如果你发现一个图没法画,那他就没法画。
8 中国邮路
中国邮路:有点类似欧拉回路,是指从某结点出发,经过每条边至少一次,最后回到终点的最短回路。
以下考虑无向连通图的中国邮路,有两个性质:
(1)每条边最多重复一次;(2)对于每个回路,重复边的长度之和不超过整个回路长度的一半;
构造方法:首先找出度数为奇数的结点,按照条件(1)随便加点边,得到一个欧拉回路;之后检查每个回路,根据条件(2)调整一下。这是一个很有离散2风格的解法,不怎么追求复杂度,反正考试的时候都是手动跑小数据……还有一个使用最小权匹配的做法,但需要用到一般图匹配,书里也没细讲,主要思路是加边的时候尽量加小的,这样就不太需要调整了。
有向图的中国邮路比较复杂,需要考虑入度出度不一致的点,为其增加虚拟节点,还要用费用流。
三 树
1 树的有关定义
不含回路的连通图称为树。
如果T是G的支撑子图,且是一棵树,则称为G的支撑树、生成树,简称G的树。
2 基本关联矩阵及其性质
基本关联矩阵:关联矩阵删去任意一个节点对应的行得到的矩阵。
连通图的基本关联矩阵rank(B)=n-1(因为前n-1个点的连边情况已知时,可以推出最后一个点的)
若H是G的子图,H中含有回路,则H的边对应的G的基本关联矩阵的各列线性相关。
如果基本关联矩阵B中某个n-1阶子阵的行列式非零,说明这n-1列构成G的一棵生成树。
3 支撑树的计数
书里关于这一节主要是各种推导(本质就是上一节的那个性质)
考虑无向图,生成树的数量=det(AA'),A为基本关联矩阵。
但AA'可以很简单地求出:设AA'=C。若i=j,则$c_{i,j}=d(v_i)$,否则$c_{i,j}=-e(i,j)$,即-1*ij间连边的数量.
如果需要一定含有某条边,可以重新画一个图,把这条边相连的两个点捏成一个点。
考虑有向图,以 $v_k$ 为根的外向生成树(根指出去)数量是det(BB'),B是将B中所有的1改成0.
但也有简单的求法:若i=j,则$c_{i,j}$=i的入度,否则$c_{i,j}=-e(j->i)$,即-1*(j指向i)的边的数量.此时的C不一定是对称矩阵。
(不过即使上面的全写成i->j的边的数量也没关系,毕竟det(A)=det(A'))
如果要求一定含e=(i,j),则不能有其他边指向j,所以删去所有指向j的边再做就好了。
4 回路矩阵与割集矩阵
一个图可能有很多回路,但某些回路可以互相生成。
求一生成树,定义基本回路为由一条余树边和若干树边组成的回路。这些基本回路是无法互相生成的。因此,回路矩阵的秩是m-(n-1)。
下面介绍求回路矩阵的方法:
然后是割集矩阵,即删去这些边后连通支+1,且这个集合极小(如果少割一条就没效果了)。
基本割集:删去一条树边,然后删去连通了上下两部分的余树边。割集矩阵的秩为n-1。
5 支撑树的生成
完全没讲,我合理推断不考!
6 Huffman树
每个点有权值,每次选出两个权值最小的点捏成新点,再对新的集合这样做,直到生成一棵树。
这样生成的树可以最小化“每个点权值*根路径长度”的和。
用于压缩算法等。
7 最短树
其实就是最小生成树。
两个方法:Prim,Kruskal。
kurskal就挺简单的,不停地加入最小的边,如果形成回路就跳过。
Prim有点类似最短路,就是不断加入离当前集合最近的点。
8 最大分枝
没讲,合理推断不考。
四 平面图与图的着色
1 平面图
2 极大平面图
3 非平面图
4 图的平面性检测
5 对偶图
6 色数与色数多项式
五 匹配与网络流
六 图的连通性
割点:如果一个图删去v这个点以及与v相连的边后连通分量变多了,那么v就是一个割点;
割边:删去这条边后连通分量变多了,那这条边就是一条割边。
块:极大的没有割点的连通子图称为块;
割点的性质:
v是G的一个割点
$\iff$ 存在与v不同的两点u,w,使任一条u到w的道路都经过v
$\iff$ $V-v$ 可以分为两个节点集 $U,W$,$\forall u \in U,w\in W$,使任一条u到w的道路都经过v
七 代数结构预备知识
就,挺类似离散一的……可能只需要看一下同构。
八 群
1 半群
设S是非空集合,·是S上的一个二元运算,如果·满足结合律,则称代数系统(S,·)为一个半群。注意,如果二元运算·满足结合律,那么也同样适合广义结合律,即可以以任意方式加括号后计算。
若半群中有单位元e存在,则称为一个含幺半群,或幺群,可记为(S,·,e)。e称为幺元,满足a·e=e·a=a。
若幺群满足交换律,则称为交换幺群。
设(M,·,e)为一个幺群,若存在一个元素 $g\in M$,M中的任意元素都可以表示为g的若干次方,则称(M,·,e)为一个循环幺群,g是M的一个生成元(生成元可能有很多个)。
循环幺群都是可交换幺群,把元素表示为幂次可得。
设(S,·)是一个半群,$T \subseteq S$,且T在·运算下封闭,则称(T,·)为(S,·)的子半群。
设(M,·,e)是一个幺群,$T \subseteq M$,且T在·运算下封闭,且 $e\in T$,则称(T,·,e)为(M,·,e)的子幺群。
设(A,·),(B,*)为两个半群(幺群),f是A到B的一个映射,若任取$a,b\in A$,有f(a·b)=f(a)*f(b),则称f是A到B的同态映射,简称同态。若f分别为单射、满射、双射,则称f为单同态,满同态、同构。
设f是(A,·)到(B,*)的满同态,S是A的非空子集,则
- 若(S,·)是半群,则(f(S),*)是半群
- 若(S,·)是幺群,则(f(S),*)是幺群