【每日一题】4月7日题目精讲 dfs序

题号 NC13611
名称
来源 牛客练习赛1
戳我进入往期每日一题汇总贴~

这个题表面上看起来像是个树上dp,但是你会发现,当xy同色的时候要求x到y的路径上所有点颜色一样这个事情非常难办——如果我们考虑颜色一个一个的涂,同色这个条件父亲节点有三个子树为例,可能其中两个子树和这个父亲节点是同样的颜色,而另外一个子树是另一个颜色,这就非常难办了。

我们考虑把树上的东西转化到线性结构上——这样的操作当然是使用dfs序啦。

----------------------以下是介绍dfs序的分割线-----------------------

dfs序:每个节点在dfs深度优先遍历中的进出栈的时间序列(为了方便接下来的操作我们往往有两种不同的写法,一种是只记录进栈顺序,一种是进栈出栈都记录,视题目的具体情况而定怎么写。)

图片说明

一般来讲,我们需要的不仅仅有这个进出栈的顺序序列,还有每个点在第几个进栈这个信息——点x在第几个进栈就是这个点的时间戳,一般记为dfn[x] (时间戳在强连通分量tarjan算法里也有很巧妙的运用)。

正如图上所说,第二种dfs序两个相同数字之间就是这个点的子树,而其实在第一种方法中你也可以用个数组记录它出栈的之前最后一个进栈的点,也就是当前访问过的点里面时间戳最大的是哪一个,这样也可也得到这个点对应的子树是在哪一个区间里了。将来你就可以通过诸如在这个树上建线段树的操作实现对子树的一些修改的维护,比如说子树所有点的权值加一个数,就很美滋滋了(这个以后有机会再讲)。

稍微注意一点,在一般的树中(二叉树除外)一个节点的儿子是没有左右顺序的可以随便先访问哪个,所以,一棵树的dfs序是可能有很多种的。

------------------------下面回到本题--------------------------------------

如果我们用dfs序来表示这棵树,并且按dfs序来一个一个点涂色的话,我们就可以把问题从树上转化到链上,问题也许会简单许多。

我们会发现,如果我们按dfs序涂色,在涂每一个点之前,他的父亲祖父等祖先节点肯定都已经先涂过了(这些点的dfs序都比当前点小),他的兄弟节点(也包括各种或近或远的“堂兄弟”节点)和兄弟节点的子树也许也涂过一些。涂这个点无非是两种选择:涂一种新的颜色,或者涂一种已经用过的颜色。涂一种新的颜色自然是没用过的颜色都可以。而涂一种已经用过的颜色的话,这个点的颜色必须和他父亲的颜色一样,因为这个点到之前的所有点的路径都是要经过它父亲的,如果他和父亲不同色,他和他同色那个点的路径上就不可能所有点颜色都一样,至少他父亲就是不同的。也就是说涂一种已经用过的颜色其实只有一种方案——和父亲相同。

于是我们发现,算涂法个数其实并不需要关心这棵树长什么样,我们就按照dfs序一个一个涂就可以了,用f[i] [j] 表示树上dfs序的前i个点用了j种颜色的方法数

图片说明

看完邓老师的题解,记得自己去做题提高呀~
欢迎各位大佬来做题写题解,也欢迎大家踊跃在当日讨论贴中提问!

活动奖励:

在牛客博客中写出题解,并回复地址
审核通过可获得(依据题目难度和题解的内容而定)

本道题目4月14日中午12:00之前写的题解有获得牛币资格~

牛客博客开通方式

  1. 如何开通牛客博客:https://www.nowcoder.com/discuss/202952
  2. 如何使用博客搬家功能:进入博客--->设置--->底部博客搬家
  3. 如果你对牛客博客有任何意见或建议:牛客博客意见反馈专贴
全部评论
萌新题解,通俗易懂~ https://blog.nowcoder.net/n/c76751c0215344ff99357aaee5235851
3 回复 分享
发布于 2020-04-06 13:00
https://blog.nowcoder.net/n/422fb1a6458646b2a0fe516a81c4f495
2 回复 分享
发布于 2020-04-06 10:58
https://blog.nowcoder.net/n/9e6e94b237c64011ba76b21caf31a5b2
1 回复 分享
发布于 2020-04-09 21:25
https://blog.nowcoder.net/n/a1f6850390c945a79ae6a59114eefe8e
点赞 回复 分享
发布于 2020-05-04 17:17
https://blog.nowcoder.net/n/a9974df0ddf04b51ad21da0023184209 假题解,真笔记。
点赞 回复 分享
发布于 2020-04-12 04:08
https://blog.nowcoder.net/n/f7400bd227de48b6855eee0df6af2356 又来写体会啦
点赞 回复 分享
发布于 2020-04-11 17:10
蒟蒻的摸鱼后题解 https://blog.nowcoder.net/n/7b6f0d1ac96645a28a06ebafb0830283
点赞 回复 分享
发布于 2020-04-11 14:30
https://blog.nowcoder.net/n/8ead9f99c0534c30a3bd907e0d650793
点赞 回复 分享
发布于 2020-04-10 16:18
https://blog.nowcoder.net/n/d615651fa0284506b0afa627a00a60b7
点赞 回复 分享
发布于 2020-04-10 16:02
https://blog.nowcoder.net/n/ce03d873755544c580d262b8fbc8b569
点赞 回复 分享
发布于 2020-04-10 15:18
https://blog.nowcoder.net/n/830a40c0d0f647059d5308dde2b77f94 清楚姐姐 我想问下为什么我写blog的时候 公式是正常显示的 但是一旦发布就会出现错误
点赞 回复 分享
发布于 2020-04-10 00:18
https://blog.nowcoder.net/n/a6f5958a2e8a49d7bf41f8943689756b
点赞 回复 分享
发布于 2020-04-09 20:42
https://blog.nowcoder.net/n/ce079c4ea59544029cc16e0ba395350e
点赞 回复 分享
发布于 2020-04-08 17:23
https://blog.nowcoder.net/n/2e298a6e845d44f7b1a027a7f71b8b11
点赞 回复 分享
发布于 2020-04-08 17:18
https://blog.nowcoder.net/n/82103bf886764839b57091e4deaf3ceb
点赞 回复 分享
发布于 2020-04-07 23:18
https://blog.nowcoder.net/n/05a868410d794187aef6bd2ba3bb702a
点赞 回复 分享
发布于 2020-04-07 21:37
https://blog.nowcoder.net/n/373dff5ce25a4298ac220407aab87e78
点赞 回复 分享
发布于 2020-04-07 18:51
https://blog.nowcoder.net/n/db761b9e9c724ea48abda4ad8c2217cc
点赞 回复 分享
发布于 2020-04-07 16:42
https://blog.nowcoder.net/n/e51124f462ab43baa6d9f356b07f4b63
点赞 回复 分享
发布于 2020-04-07 14:54
https://blog.nowcoder.net/n/46755548743c45de99777bef2f5f47d9
点赞 回复 分享
发布于 2020-04-07 14:54

相关推荐

05-09 12:23
已编辑
华南理工大学 Java
野猪不是猪🐗:给他装的,双九+有实习的能看的上这种厂我直接吃⑨✌们拿它练练面试愣是给他整出幻觉了
点赞 评论 收藏
分享
后来123321:别着急,我学院本大二,投了1100份,两个面试,其中一个还是我去线下招聘会投的简历,有时候这东西也得看运气
点赞 评论 收藏
分享
评论
4
1
分享

创作者周榜

更多
牛客网
牛客企业服务