“拓扑序把依赖线性化,却不表示所有顶点必须串行执行。工作—深度模型用总工作和最长依赖链评价并行 DAG 调度;树宽动态规划则沿一般图的树分解传播局部状态,原图不必是 DAG。构建系统、课程安排…”
边界状态原则 ​
给宽度
Nice decomposition 转移 ​
leaf 给空状态;introduce vertex 加入一个 bag 顶点并枚举其局部状态;introduce edge 检查/更新边约束;forget vertex 在它离开边界前汇总所有可能;join 的两个孩子有同一 bag,要组合彼此内部独立但边界一致的状态。join 最容易重复计算 bag 顶点的权重,需只在固定引入/遗忘时计一次。
独立集例子 ​
状态是 bag 的独立子集
边界 ​
分解树节点不是原图顶点。Hamilton cycle 等连通问题若直接记录 bag 的分区,状态可达 Bell 数;需 rank-based、Cut&Count 或代表集进一步压缩。算法输入若不含分解,还必须计求 tree decomposition 的 FPT/近似成本。
状态充分性的证明 ​
正确性通常按分解树归纳:两份已处理部分若在当前 bag 上具有相同状态,则对任何未处理上方图,它们可扩展为解的可能性和最佳代价相同。这个“可替换性”证明比列出转移更重要;若状态漏掉边界连通关系,join 后可能把两条路径错误拼成环。
Nice decomposition 可由普通分解在
独立集状态的完整转移 ​
对每个 bag
- introduce
:选择 时检查它与 无边; - forget
:在子状态含或不含 两者中取最大; - join:两孩子取同一
,相加后减去 bag 中被重复计算的 ; - leaf:从空 bag 的零值开始。
每个 bag 有
连通性问题的状态不只记录选中顶点,还要记录 bag 上的连通分区,状态数可能是
参考资料
- Hans Bodlaender, Treewidth: Algorithmic Techniques and Results, MFCS, 1997.
- Marek Cygan et al., Parameterized Algorithms, Springer, 2015.