P11337 「COI 2019」IZLET 题解
先考虑构建树的形态,显然可以将所有边按边权从小到大排序,构造最小生成树。注意到相邻的两个点之间的颜色数只可能是 \(1\) 或 \(2\),所以只考虑边权 \(\le 2\) 的就好了。
接下来考虑怎么染色。考虑从一个点开始 dfs,每次确定当前遍历到的点的颜色,考察当前点到父亲的边权:
- 等于 \(1\),则颜色与父亲相同。
- 等于 \(2\),则颜色与父亲不相同,可能与之前遍历过的一个点颜色相同。记 \(a_{i,j}\) 为 \(i,j\) 两点之间的颜色数,容易发现 \(a_{x,z}\le a_{x,y}+a_{y,z}\le a_{x,z}+1\),如果存在一个点 \(y\) 与当前点 \(x\) 满足 \(a_{x,y}\neq a_{fa_x,y}+1\),则当前点 \(x\) 一定与 \(fa_x\) 到 \(y\) 路径上的一个点颜色相同。找到离 \(x\) 最近的点 \(y\) 即可,令点 \(x\) 的颜色与点 \(y\) 相同。如果不存在这样的点 \(y\) 则令点 \(x\) 的颜色为 \(x\)。