给树染色

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

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

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

证明利用邻项交换法(其实这个证明完全可以是一个发现的过程,令下面的证明过程中n=m=p=1即可,也就是我们最开始没有连续染色的想法,而是直接得到了一个一个染色的最优序列,然后利用微扰就可以发现权值最大的点一定会在其父节点被染了之后立马染,也就是存在连续染色的性质,于是我们直接一般化,假设我们得到的最优序列为若干段,每一段都是已经知道的需要连续染色的点;这本来就是一个序列的问题,想到邻项交换法也是比较自然的)

假设对于最优序列,某个点是i=1mbi(微扰法的思想,随便选取一个点进行论证),他的父节点是i=1nai,而最优序列的b前面第一个是c(ca),交换b,c后(显然这个交换是合法的,因为c不是b的父亲节点),设交换前c之前一共染了T个点,则为i=1mbi×(T+i)+i=1pci×(T+m+i),而交换后为i=1pci×(T+i)+i=1mbi×(T+p+i),两者相减并除以mp得到i=1pcipi=1mbim<0,这是交换之后更优的条件,我们发现这就是蓝书上说的等效权值(注意这里不能直接像国王游戏那样排序,因为有a的限制,总之来说不好做,而我们要让这个式子成立的话,直接考虑等效权值最大的点就好了)。注意可以交换的前提是ab前面,也就是说,对一个序列等效权值最大的点,如果其与其父节点中间有其他点,我们就可以说明这不是最优的序列,所以一个序列等效权值最大的点一定会在其父节点被染色之后立马被染色

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

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

posted @   最爱丁珰  阅读(35)  评论(0编辑  收藏  举报
相关博文:
阅读排行:
· TypeScript + Deepseek 打造卜卦网站:技术与玄学的结合
· 阿里巴巴 QwQ-32B真的超越了 DeepSeek R-1吗?
· 【译】Visual Studio 中新的强大生产力特性
· 10年+ .NET Coder 心语 ── 封装的思维:从隐藏、稳定开始理解其本质意义
· 【设计模式】告别冗长if-else语句:使用策略模式优化代码结构
点击右上角即可分享
微信分享提示