P2478 [SDOI2010] 城市规划 解题报告
简要题意
给定一个 \(n\) 个点 \(m\) 条边的仙人掌图,每一个点有点权。请求出图上一个权值最大的集合,满足集合中任意两点距离大于等于 \(2\)。
注:仙人掌图指一个满足任意一个点至多在一个环中的无向图。
数据范围:\(n \le 1\times 10^6,m \le 2 \times 10^6\)。
分析
仙人掌图 dp 需要分为树上 dp 和环上 dp 两部分。
首先,你需要跑一遍 Tarjan 判环。
为了方便说明,我们约定:
- \(dp_{u,0}\) 表示选择 \(u\) 点时 \(u\) 子树内的最大权值和;
- \(dp_{u,1}\) 表示不选择 \(u\) 点、选择 \(u\) 的一个儿子时 \(u\) 子树内的最大权值和;
- \(dp_{u,2}\) 表示不选择 \(u\) 点、不选择 \(u\) 的儿子时 \(u\) 子树内的最大权值和;
(和树形 dp 挺像的,对吧?)
树上 dp 部分
如果你有树形 dp 基础,那么可以跳过这一部分。
对于 \(dp_{u,0}\):因为选了 \(u\),那么 \(u\) 的儿子肯定都不能选,同时 \(u\) 的儿子的儿子也不能选,因此有
\[dp_{u,0}=val_u+\sum \limits_{v\in son_u} dp_{v,2}
\]
对于 \(dp_{u,2}\) :既然都不选 \(u\) 了,那么只需要在 \(u\) 的儿子不选的情况中,选一个权值较大的就行了。
\[dp_{u,2}=\sum \limits_{v\in son_u} \max(dp_{v,1},dp_{v,2})
\]
对于 \(dp_{u,1}\):因为 \(u\) 只选一个儿子,也就是在所有儿子都不选的情况中,将其中一个儿子变为选的情况,也就是:
\[dp_{u,1}=dp_{u,2}+\max \limits_{v \in son_u}(dp_{v,0}-max(dp_{v,0},dp_{v,1}))
\]
环上 dp 部分
首先,我们考虑从 \(u\) 点处破环为链(即断开环上一条以 \(u\) 为一段的边),将环上的点按距离 \(u\) 的距离从小到大排序为序列 \(a\)。(其中 \(a_1=u\))。
然后我们先对 \(u\) 非环上儿子进行一次树上 dp 的转移。
为了方便说明,我们定义:
- 环的长度为 \(m\);
- 因为我们将环转换为链后,除了某些需要特殊讨论的点以外,其他点可以像树上 dp 一样处理,所以我们定义 \(solve(l,r)\) 表示在保证 \([l,r]\) 区间外的点对区间内的点的选取情况不影响的前提下,\([l,r]\) 区间内的点可以取得的最大权值和。
对于 \(dp_{u,0}\):因为选了 \(u\),所以能选的区间只有 \([4,m-2]\),因此有:
\[\Delta dp_{u,0}=val_u+dp_{a_1,2}+solve(4,m-2)+dp_{a_m,2}
\]
对于 \(dp_{u,2}\):因为 \(u\) 及其儿子都不选,所以能选的区间为 \([3,m-1]\),因此有:
\[\Delta dp_{u,2}=solve(3,m-1)
\]
对于 \(dp_{u,1}\):选择的儿子不同,转移也不同,因此要分类讨论:
- 如果选择的儿子不在环上,那么有:
\[\Delta dp_{u,1}=solve(3,m-1)
\]
- 如果选择的儿子在环上且为 \(a_2\),那么有:
\[\Delta dp_{u,1}=dp_{a_2,0}+dp_{a_3,2}+solve(5,m-1)
\]
- 如果选择的儿子在环上且为 \(a_m\),那么有:
\[\Delta dp_{u,1}=dp_{a_m,0}+dp_{a_{m-1},2}+solve(3,m-3)
\]
然后模拟即可。