图论3-Tree
图论3:Tree
树&森林
若一个连通图没有圈,称这个图为树(Tree);
若一个图没有圈,称这个图为森林(forest);
Theorem
若树$T$至少有$n\ge 2$个点,那么$T$至少包含2个叶子结点;
proof:取最长路的两个端点;
Theorem
对于含有$n$个结点的简单图,以下命题等价:
- $T$是一棵树;
- $T$有$n-1$条边且没有圈;
- $T$有$n-1$条边且连通;
- $T$连通,且每条边都是桥;
- $T$中任意两个点有且仅有一条路径;
- $T$没有圈,但是任意添加一条边恰好形成一个圈;
proof:
$1\Rightarrow 2$:归纳,删去叶子
$2\Rightarrow 3$:归纳,每个连通分量无圈,说明分量是树,统计边发现只有一个连通 分量;
$3\Rightarrow 4$:只需证$n$个点的连通图至少有$n-1$条边,归纳,删叶子即可;
$4\Rightarrow 5$:由连通性至少有一条,若存在两条,则这两条路径上的边不是桥,矛盾;
$5\Rightarrow 6$:若有圈则任意两点至少两条路径,矛盾;加一条边至少形成一个圈,若多余1个,说明原图有圈,矛盾;
$6\Rightarrow 1$:反证,若不连通,每个分量是树,在分量之间添加一条边无法形成圈,矛盾;
Corollary
若图$G$是一个森林,则$|E(G)|=|V(G)|-\omega(G)$
Spanning Tree
图$G$的生成子树(spanning tree)是指图$G$的一个生成子图,这个子图是树;
对于连通图$G$,一定包含一个生成子树;定义陪树(cotree)为$G$中去除$T$得到的图;
对于一个具有$n$个顶点,$m$条边,$k$个连通分量的图$G$,通过删除图$G$中任意一条边,直到没有圈剩下,得到的图是图$G$的一个生成森林;
- 圈阶$\gamma(G)$:在这个过程删除的边数$\gamma(G)=m-n+k$
- 键阶$\xi(G)$:最小边割的边数$\xi(G)=n-k$;
对与连通图$G$和其生成子树$T$,
定义子树$T$的键基本集(bond fundamental set):删去子树$T$将图$G$划分为两个顶点集$V_1,V_2$,连接$V_1,V_2$的所有边构成图$G$的键,通过这种方式获得的键的全体构成基本集;
类似定义子树$T$的圈基本集(cycle fundamental set)
Theorem
对于图$G$的任意生成子树$T$,有
- 图$G$的任意键和$T$至少有一条公共边;
- 图$G$的任意圈和$T$的陪树至少有一条公共边;
proof:取$C^$是图$G$的键,删去$C^$将图$G$分成两部分,$T$一定有边连接这两部分,这条边一定属于键;若圈和陪树没有公共边,那么圈一定包含在$T$中,矛盾;
Prufer序列
给定由$n$个数构成的集合$S$,记$T$是定义在$S$上的一棵树;
定义$T$的Prufer编码$f(T)$,$f(T)$是长度为$n-2$的序列,显然$f(T)\in S^{n-2}$;
编码算法如下:
- 维护$T$的叶子集合$L$;
- 在第$i$步,找到$L$中标号最小的叶子$b_i$, 令$a_i$是叶子的父亲;
- 更新$L\leftarrow L-b_i, f(T)\leftarrow f(T)+a_i$;若$a_i$因为删去$b_i$成为叶子,$L\leftarrow L+a_i$
- 直到只剩下一条边,停止;
解码算法如下:
- 维护未加标记点集$V$和未使用的编码点集$F$,初始化$V:=S,F:=f(T)$,初始化图$T$为$n$个孤立点
- 准备第$i$步,取出$f_i(T)$,此时$|V|=n-i+1,|F|=n-i-1$,$V$中至少有2个点不会出现在$F$中,即$|V-F|\ge 2$;
- 取$x$为$V-F$中标号最小的顶点,添加$xf_i(T)$到$T$,标记$x$,$F\leftarrow F-f_i(T)$(即从$i+1$位开始,指针右移);
- 重复2,3一共$n-2$次,剩下两个未标记的顶点,连边并加入$T$;
举例:以下树的Prufer编码为[6,5,6,5,1]
,发现编码删边的顺序和解码加边的顺序相同;
Theorem(Caylay)
对于$n$个顶点,一共有$n^{n-2}$个不同的标号树;
proof:只需要证明树$T$作Prufer编码和解码,依然得到树$T$,完成双射,归纳即可(删去第一个叶子后采用归纳假设);
Corollary
$K_n$有$n^{n-2}$个生成子树;
矩阵树
定义连通图$G$,定义其生成子树的数量为$\tau(G)$;记其Laplacian矩阵为$L=(l_{ij})$;
对于图$G$和其中一条边$e$,定义其缩边$G\cdot e$为合并$e$的两个顶点为一个顶点,原来和两个顶点关联的边都和新顶点相关联;
Theorem
若$e\in E(G)$且不是自环,则
$$
\tau(G)=\tau(G-e)+\tau(G\cdot e)
$$
为此只需证明$G\cdot e$的生成树和$G$中包含$e$的生成树之间可建立双射即可;
Theorem
假设$L^$是从$L$中删除$s$行$t$列得到的矩阵,则生成树的数目等于$L$的任何余子式的值;
$$
\tau(G)=(-1)^{s+t}\det L^
$$
proof:为此只需证明$s=t$的情况
树中的最优化问题
The Connector Problem
将建立连接多个城镇的铁路网。考虑到在城镇$v_i$和$v_j$之间建造直接连接的成本$c_{ij}$,设计这样的网络以最大限度地降低建设总成本;
这个问题可进一步形式化描述如下:
给定一个连通加权图$G$,如果$T$的边权之和不超过$G$的任何其他生成树之和,则生成树$T$称为最小权重生成树,现需要找到图$G$的最小生成子树权和;
Kruskal算法
Kruskal算法用于解决一类稀疏带权图的最小生成树问题,这是一类基于添加当前最优边的贪心策略;
- 初始化$E(T)=\varnothing,V(T)=V(G)$,对边权值排序;
- 若下一条权值最小的边$e$将$T$的两个分量连接起来,则$E(T)\leftarrow E(T)+e$,否则丢弃它;
- 迭代总共$V(G)-1$步加边操作,此时$T$变得连通;
Kruskal算法最优性证明:
假设Kruskal生成树$T$,其一定不包含圈,否则一定存在某次加边操作,没有连接两个分量而是在某一个分量内部连接;
假设最小代价树$T^\neq T$,边排序后,考虑它们不相同的第一条边$e$;$T^+e$将产生圈$C$,取$e^\in C-T$,那么$T+e-e^$是比$T^*$更小代价的生成树,矛盾;
数据结构实现:
顺序迭代边可采用优先队列(堆);
为每个顶点$v$记录包含$v$的连通分量标号$c(v)$,初始为其序号;
对于选用某条边$uv$时,应该有$c(u)\neq c(v)$,否则被弃用;
添加边后,应该更新$c(u)=c(v)\leftarrow\min(c(u),c(v))$;
时间复杂度应为$O(|V|log|M|)$;
或是维护边的并查集
Prim算法
Prim算法用于一类稠密带权图的最小生成树问题,这时一类逐步归并顶点的策略;
- 任意选择树的根节点$r$,初始化已包含顶点集$S={r}$,树$T:V(T)=V(G),E(T)=\varnothing$;
- 选择连接$S$和$V(G)-S$中的边权值最小者$uv,u\in S,v\in V(G)-S$,更新$S\leftarrow S+v,E(T)\leftarrow E(T)+uv$;
- 重复添加顶点,直到$S=V(G)$;
Prim算法最优性证明:
假设Prim生成树$T$,其一定不包含圈,因为每次加边操作都是在不相交的集合中选择的;
假设最小代价树$T^\neq T$,边排序后,考虑它们不相同的第一条边$e\in T$;取$e^\in T^$,由$T^$的最小性,$\omega(e^)< \omega(e)$,由算法最小性$\omega(e)\le \omega(e^)$;
数据结构实现:
存取图使用邻接表,采用斐波那契堆优化,可达到$O(|E|+|V|log|V|)$;