给树染色

其实感觉蓝书上讲的不是很好

我们假设经历了一些时刻了,每个节点里面现在包含若干个有先后顺序小节点,代表着这些小节点的染色顺序

这题的关键性质其实是,任意时刻,等效权值最大的点一定是会在其父节点里面的小节点依次染完后,立马把里面的小节点按照顺序染完(这个性质怎么发现的?我们发现不太好直接确定这个序列的染色方案,所以我们转换对象,考虑节点,从特殊的节点开始考虑,于是考虑权值最大的节点)

证明利用邻项交换法(其实这个证明完全可以是一个发现的过程,令下面的证明过程中\(n=m=p=1\)即可,这本来就是一个序列的问题,想到邻项交换法也是比较自然的)

假设当前某个点是\(\sum_{i=1}^{m} b_i\),他的父节点是\(\sum_{i=1}^{n}a_i\),而最优序列的\(b\)前面是一个\(c(c≠a)\),交换\(b,c\)后(显然这个交换是合法的,因为\(c\)不是\(b\)的父亲节点),设交换前\(c\)之前一共染了\(T\)个点,则为\(\sum_{i=1}^{m} b_i \times (T+i) + \sum_{i=1}^{p} c_i \times (T+m+i)\),而交换前为\(\sum_{i=1}^{p} c_i \times (T+i) + \sum_{i=1}^{m} b_i \times (T+p+i)\),两者相减并除以\(mp\)得到\(\frac{\sum_{i=1}^{p} c_i}{p}-\frac{\sum_{i=1}^{m} b_i}{m}<0\),这是交换之后更优的条件,我们发现这就是蓝书上说的等效权值(注意这里不能直接像国王游戏那样排序,因为有\(a\)的限制,总之来说不好做,而我们要让这个式子成立的话,直接考虑等效权值最大的点就好了)。注意可以交换的前提是\(a\)\(b\)前面,也就是说,对一个序列等效权值最大的点,如果其与其父节点中间有其他点,我们就可以说明这不是最优的序列,所以一个序列等效权值最大的点一定会在其父节点被染色之后立马被染色

这道题目的代码看一下,写的挺好的,学下怎么合并节点

注意如果某个时刻根节点是等效权值最大的点,我们寻找等效权值次大的点就好了

posted @ 2023-12-06 21:44  最爱丁珰  阅读(32)  评论(0编辑  收藏  举报