题目大意
给定一棵有 nnn 个点的树,需要给每条边染色,颜色编号为 1∼k1\sim k1∼k。要求对于任意一个点,与它相连的所有边颜色必须两两不同。判断是否存在合法方案,若存在输出任意一种。
题解思路
树的边染色要求“每个点相邻边颜色两两不同”,这就是树上的proper edge coloring。设树的最大度数为 Δ\DeltaΔ。必要条件是 k≥Δk\ge \Deltak≥Δ:因为度为 Δ\DeltaΔ 的点周围 Δ\DeltaΔ 条边必须用不同颜色。
对树而言这也是充分条件:当 k≥Δk\ge\Deltak≥Δ 时一定能染色。构造方法用一次 DFS 从根向下分配颜色即可。
把树以 1 为根。对每个点 uuu,设与父边的颜色为 parColor[u](根为 0)。我们给 uuu 的所有子边依次分配颜色 1..k,但跳过 parColor[u],并且同一节点内部不重复。因为 uuu 的子边数是 deg(u)-1(根是 deg(u)),而 deg(u)≤kdeg(u)\le kdeg(u)≤k,所以总能分配完且不会用到第 k+1k+1k+1 种颜色。
实现上先用栈/队列求出父子关系,再按父到子的顺序给边赋色,复杂度 O(n)O(n)O(n)。
若 k<Δk<\Deltak<Δ,直接输出 NO。
参考代码