#3338. tree

· · 个人记录

有一个 n 个节点的树,每个节点上有一个颜色 a_i,令 f_{i, j} 表示节点 i 到节点 j 的路径上所有点的不同颜色数量。现在给你一个 n\times n 的二维数组,请你找到一个树和一个颜色方案能得到输入的 f 数组,保证有解。

\mathbf{Preperation}

这题可能是怎么做的。

\mathbf{Lemma}

:::warning[\mathbf{Lemma. 1}]{open} 如果一个 x 能通过同一个点权到达 S,那么对于所有 x, y \in S,都有 f_{x, y} = 1

推论:不存在 x \in S, y \notin Sf_{x, y} = 1。 :::

:::warning[\mathbf{Lemma. 2}]{open} 对于两个同色集合 A, B,有所有 x \in A, y \in Bf_{x, y} 都相等。 :::

\mathbf{Question. 1}

颜色数最多两种时,如何构造?

::::info[\mathbf{ANSWER}]{open} 先随便选一个点 x,那么与 x 相连的点集被分为 A, B,其中 A 是一种,B 是两种。

我们先拉出若干条边权为 $1$ 的链,再用 $2$ 连起来即可。 :::: ### $\mathbf{Question. 2}

当存在链的解时,如何构造?

:::error[\mathbf{Mistake}] 场上没看到 i \to i + 1,导致被误导,认为每次还要特地去寻找新的结点,并判定是否能接到链的末尾。

还是实力问题! :::

:::info[\mathbf{ANSWER}]{open}

假设我们已经求出了 1x 的颜色是什么,现在要加入第 x + 1 个点。

考虑 f_{i, x}f_{i, x + 1}。如果这两个数相等,说明 c_{x + 1}[i, x] 中出现过了,否则就是没出现过。

我们找到最后一个 i,使得 f_{i, x} = f_{i, x + 1},那么,由于 c_{x + 1}[i, x] 出现而不在 [i + 1, x] 出现,我们有 c_i = c_x

如果全部都不相等,就设 c_{x + 1} = x + 1。若有解那么这一定是可行的。

:::

\mathbf{Question. 3}

::::info[$\mathbf{ANSWER}$]{open} 我们考虑将链上的做法放到树上。 假设我们当前考虑到 $v$,然后我们要找到一个 $f_{i, u} = f_{i, v}$ 且 $f_{i', u} \neq f_{i', v}$,这时一定有 $c_v = c_i$。 对于这个,我们枚举 $u, v$,然后从 $u$ 开始 DFS,如果遇到了合法的 $i$,就不往下 DFS 了。 :::: ### $\mathbf{Question. 4}

如何找到一个合法的树?

::::info[\mathbf{ANSWER}]{open}

如果 f_{u, v} = 1,由 \mathbf{Lemma. 1 / 2},我们可以把他们压起来。因此,我们可以默认 f_{u, v} > 1

首先,一条合法的树边 u \to vf_{u, v} 肯定为 2。但是可能有很多的 f_{u, v} = 2,所以似乎不知道要选哪一些边。

现在,有结论:原题存在解等价于对于任意一个 f_{u, v} = 2(u, v) 组成的生成树,该树存在解。

:::warning[\mathbf{Prove}(感性理解)]{open}

我们观察 f_{u, v} = 2(u, v) 点对。实际上,如果有一个 f_{u, v} = 2,那在 uv 的路径上的任意两个点 x, y,都有 f_{x, y} = 2

也就是说,这个图实际上是若干个团连接在了一起,如下图:

因此,每个团之间是互相独立的。我们单独考虑每个团,假设团的点集为 S,该团的两种点权分别是 a, b

我们考虑所有 xy 的经过 S 的路径,这时有两种可能:

因此,其实对于一个团内的连边方式并不重要,我们任取一个生成树即可。 :::

通过这个结论,我们可以随便找一颗 f_{u, v} = 2 的生成树,然后跑 \mathbf{Question. 3} 的染色方法即可。

::::