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) \]

然后模拟即可。

posted @ 2025-08-28 18:12  XiaoZi_qwq  阅读(4)  评论(0)    收藏  举报