有一个
n 个节点的树,每个节点上有一个颜色
ai,令
fi,j 表示节点
i 到节点
j 的路径上所有点的不同颜色数量。现在给你一个
n×n 的二维数组,请你找到一个树和一个颜色方案能得到输入的
f 数组,保证有解。
Preperation
这题可能是怎么做的。
- 观察部分分,有只考虑链的情况。我们可以先不考虑树的结构,只单纯思考颜色的构造。
- 当颜色数特别少的时候,如何构造?
Lemma
Lemma.1
如果一个
x 能通过同一个点权到达
S,那么对于所有
x,y∈S,都有
fx,y=1。
推论:不存在
x∈S,y∈/S,
fx,y=1。
Lemma.2
对于两个同色集合
A,B,有所有
x∈A,y∈B,
fx,y 都相等。
Question.1
颜色数最多两种时,如何构造?
ANSWER
先随便选一个点
x,那么与
x 相连的点集被分为
A,B,其中
A 是一种,
B 是两种。
A 集合里的点肯定
cx 相等,那么
A 与
x 向外连的路径一定都是
2。
我们先拉出若干条边权为
1 的链,再用
2 连起来即可。
Question.2
当存在链的解时,如何构造?
Mistake
场上没看到
i→i+1,导致被误导,认为每次还要特地去寻找新的结点,并判定是否能接到链的末尾。
还是实力问题!
ANSWER
假设我们已经求出了
1 到
x 的颜色是什么,现在要加入第
x+1 个点。
考虑
fi,x 和
fi,x+1。如果这两个数相等,说明
cx+1 在
[i,x] 中出现过了,否则就是没出现过。
我们找到最后一个
i,使得
fi,x=fi,x+1,那么,由于
cx+1 在
[i,x] 出现而不在
[i+1,x] 出现,我们有
ci=cx。
如果全部都不相等,就设
cx+1=x+1。若有解那么这一定是可行的。
Question.3
Question.2 的
ANSWER 能不能扩展?换句话说,能否在一般的树上找到一个染色方法?
ANSWER
我们考虑将链上的做法放到树上。
假设我们当前考虑到
v,然后我们要找到一个
fi,u=fi,v 且
fi′,u=fi′,v,这时一定有
cv=ci。
对于这个,我们枚举
u,v,然后从
u 开始 DFS,如果遇到了合法的
i,就不往下 DFS 了。
Question.4
如何找到一个合法的树?
ANSWER
如果
fu,v=1,由
Lemma.1/2,我们可以把他们压起来。因此,我们可以默认
fu,v>1。
首先,一条合法的树边
u→v,
fu,v 肯定为
2。但是可能有很多的
fu,v=2,所以似乎不知道要选哪一些边。
现在,有结论:原题存在解等价于对于任意一个
fu,v=2 的
(u,v) 组成的生成树,该树存在解。
Prove(感性理解)
我们观察
fu,v=2 的
(u,v) 点对。实际上,如果有一个
fu,v=2,那在
u 到
v 的路径上的任意两个点
x,y,都有
fx,y=2。
也就是说,这个图实际上是若干个团连接在了一起,如下图:
因此,每个团之间是互相独立的。我们单独考虑每个团,假设团的点集为
S,该团的两种点权分别是
a,b。
我们考虑所有
x 向
y 的经过
S 的路径,这时有两种可能:
- 只经过了 S 中的一个点 t,这时经过的边一定与该团无关,与 ct 有关
- 经过了 S 中的一条边,这时路径只与该团的两种权值 a,b 有关
因此,其实对于一个团内的连边方式并不重要,我们任取一个生成树即可。
通过这个结论,我们可以随便找一颗
fu,v=2 的生成树,然后跑
Question.3 的染色方法即可。