【每日一题】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

相关推荐

06-10 23:36
已编辑
首都经济贸易大学 C++
点赞 评论 收藏
分享
不愿透露姓名的神秘牛友
06-21 11:33
昨天是学校最后一场招聘会,鼠鼠去参加了,全场只有一个招聘java的岗位,上来先做一份笔试题,做完后他拿张纸对答案,然后开始问简历上的问题,深圳小厂,6-8k(题目如下),后面还有两轮面试。然后我就在招聘现场逛呀逛,看到有公司招聘电商运营,给的比上年的小厂还多,鼠鼠就去了解了下,然后hr跟鼠鼠要了份简历,虽然我的简历上面全是求职Java开发相关的内容,但是hr还是鼓励我说没关系,她帮我把简历给老板看看,下周一会给我通知。招聘会结束后鼠鼠想了一段时间,也和朋友聊了聊,发现我可能是不太适合这个方向,然后就跟爸爸说回家了给我发条微信,我有些话想跟他说说。晚上爸爸到家了,跟我发了条微信,我立马跑出图书馆跟他打起了电话,这个通话长达一个小时,主要是跟爸爸坦白说我不想找这行了,是你的儿子太没用了,想试试其他行业。然后爸爸也跟我说了很多,说他从来没有希望我毕业后就赚大钱的想法,找不到就回家去,回家了再慢慢找,实在找不到就跟他干(帮别人装修房子,个体户),他也知道工作不好找,让我不要那么焦虑,然后就是聊一些家常琐事。对于后面的求职者呢我有点建议想提一下,就是如果招实习的时间或者秋招开始,而你的简历又很差的情况下,不要说等做好项目填充完简历之后再投,那样就太晚了,建议先把熟悉的项目写上简历,然后边投边面边完善,求职是一个人进步的过程,本来就比别人慢,等到一切都准备好后再投岂不是黄花菜都凉了。时间够的话还是建议敲一遍代码,因为那样能让你加深一下对项目的理解,上面那些说法只是针对时间不够的情况。当然,这些建议可能没啥用,因为我只是一个loser,这些全是建立在我理想的情况下,有没有用还需其他人现身说法。上篇帖子没想到学校被人认了出来,为了不丢脸只能匿名处理了。
KPLACE:找研发类或技术类,主要还是要1.多投 2.多做准备,很多方面都要做准备 3.要有心理准备,投累了就休息一两天,再继续,要相信自己能找到
投递58到家等公司7个岗位
点赞 评论 收藏
分享
评论
4
1
分享

创作者周榜

更多
牛客网
牛客网在线编程
牛客网题解
牛客企业服务