【学习笔记】树分解算法

树分解(tree decomposition)

对于一个无向图 \(G=(V,E)\) ,我们可以给出其一个树分解 \(TD=(T,(B_t)_{t\in V(T)})\)

其性质及和 \(G\) 的对应关系包括:

  • \(T\) 为一棵树, \(E(T)\) 为其点集, \(V(T)\) 为其边集
  • \(\forall t\in V(T)\) ,有其对应一个包(Bag) \(B_t\) ,满足 \(B_t\subseteq V\)
  • \(\forall v\in V\) ,有集合 \(\{t\mid v\in B(t)\}\)\(T\) 上联通
  • \(\forall (u,v)\in E\)\(\exist t\in V(T)\) 使得 \(u,v\in B_t\)

树宽度(tree-width)

对于某一特定树分解 \(TD=(T,(B_t)_{t\in V(T)})\) ,其树宽度为 \(width(TD)=\max\limits_{t\in V(T)}\{|B_t|-1\}\)

而一个图的树宽度就是 \(tw(G)=\min\{width(TD)\}\) ,其中 \(TD\)\(G\) 的一个树分解。

注意到一些事实:

  • 一棵树的树宽度是 \(1\)

有一个比较明显的构造,就是将一个点 \(v\) 及其父亲作为一个包然后用这个包去代替原树中的 \(v\)

  • 任意环的树宽度是 \(2\)

构造类似上一个,而没有宽度为 \(1\) 的树分解是因为假如有可以推出树分解成环

  • 任意点数为 \(k\) 的完全图树宽度为 \(k-1\)

证明类似上一个

基于树分解的最大独立集算法

对于固定自然数 \(w\) ,存在一个线性时间的算法对所有满足 \(tw(G)\leq w\) 的图 \(G\) 输出它的一个最大独立集。

树分解诱导的子图

给定图 \(G\) 和它的树分解 \(TD=(T,(B_t)_{t\in V(T)})\)满足 \(width(TD)\leq w\)
对任意 \(t\in V(t)\):

  • \(G_t^0\) 是由 \(B_t\) 诱导的子图 。
  • \(G_t\) 是由对于 \(t\) 为根的子树 \(T_t\)\(\bigcup\limits_{t'\in T_t}B_t\) 所诱导的子图

基于这个定义,令 \(son_t\) 表示 \(t\) 的儿子节点集合,考虑这样一个动态规划:

\(dp(t,X)\) 表示 \(X\subseteq B_t\)\(X\) 为独立集时满足 \(I\cup B_t=X\)\(G_t\) 的独立集 \(I\) 的大小最大值。

我们考虑固定 \(B_t\) 内的独立集,那么就由树分解含相同点的包之间联通的性质可以得到不在 \(B_t\) 内的点是独立的,这就为动态规划中可以自由拼接独立集形成了基础。

最终可以得到我们的DP柿子:

\[dp(t,X)=|X|+\sum_{t'\in son_t}\max\limits_{X'\cap B_t=X\cap B_{t'}}\{dp(t',X')-|X\cap X'|\} \]

这样我们就得到了一个 \(\mathcal O(n2^{2w})\) 的算法,在 \(w\) 有上界的时候就是 \(\mathcal O(n)\)

3着色问题

给定 图 \(G=(V,E)\)。它的一个3着色是个函数 \(f:V\to\{1,2,3\}\) 满足对所有的边 \((u,v)\in E\) 我们都有 \(f(v)\neq f(u)\)

这实际上是一个NPC问题,但是在 \(w\) 有上界的时候依然有高效算法。

还是利用边的关系只需要在父子节点之间考虑,我们考虑动态规划

\[dp(t)=\{f|f为G_t^0的3着色且可以扩充为G_t的3着色\} \]

那么在转移的时候只需要考虑某个方案是否会和某一子节点的所有方案都矛盾即可。

posted @ 2023-07-11 11:19  思考人生中…  阅读(296)  评论(0编辑  收藏  举报