给树染色1

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

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

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

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

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

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

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

  • 10
    点赞
  • 13
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
节点染色是指给数据结构中的每个节点分配一种颜色或标记,以此来帮助解决问题或进行一些特定操作。在Python中,可以通过以下方法来实现节点染色。 首先,我们需要定义一个节点的类,用来表示每个节点的属性和方法。该类可以包括节点的值、子节点列表、以及染色的属性等。例如: ```python class TreeNode: def __init__(self, value): self.value = value self.children = [] self.color = None ``` 接下来,我们可以定义一个函数,来对节点进行染色操作。该函数可以使用递归的方式,不断遍历的每个节点,并为其分配颜色。例如,可以使用深度优先搜索(DFS)或广度优先搜索(BFS)来遍历节点,并依次给每个节点染色。具体的染色规则可以根据问题的需求来定义。 以下是一个简单的示例,使用DFS对节点进行染色: ```python def color_tree_dfs(node, colors): if node is None: return for child in node.children: color_tree_dfs(child, colors) # 给当前节点染色 if colors: node.color = colors.pop(0) else: node.color = "No color available" ``` 以上代码中,节点的颜色是通过一个颜色列表进行分配的。函数每次从颜色列表中取出一个颜色,对当前节点进行染色,并将列表中的该颜色移除。如果颜色列表为空,则当前节点将被标记为"No color available"。 通过这样的方式,我们可以对节点进行染色操作,并实现根据问题需求设置节点颜色。当然,具体染色的规则和递归的方式可能因实际问题的不同而有所调整。

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值