【每日一题】4月13日题目精讲 树型dp,换根

题号 NC51180
名称 Accumulation Degree
来源 《算法竞赛进阶指南》0x54
如果不会做的话可以先去学习另外一个题:201400 树学
写这两道题目中的任意题目,都可以获得牛币,写两篇题解可能获得更多牛币~

戳我进入往期每日一题汇总贴~

感谢@Alan233 同学推荐题目
如果你在题库做题时遇到了喜欢的题目,欢迎推荐给邓老师~ 点击查看详情

先看201400树学这个题

本题是要你任选一个点为根使得树上的所有点深度之和最小。

首先考虑如果是指定根节点你会不会做:已知根节点的话,我们只需要一遍dfs(或者bfs)就可以求出每个点的深度,然后求和就可以了。

然后我们考虑如果我们知道当前节点x为根的结果能否快速求出以它某儿子y为根的结果——当y从根的儿子变成根,它和它的子树都向上提了一层,深度-1,而x往下了一层,它除了y以外的其他子树也一起往下了一层,深度加以。所以从以x为根变为以y为根,深度之和减少了y的子树的大小,增加了其他点数的个数。

如果我们用f[i]表示以i为根的时候每个点深度的和,我们可以用一遍dfs把f[1]求出来——以1为根dfs,给每个点维护一个dep[i],显然(y是x的儿子),dfs结束之后求和就好。根据之前的分析在这次dfs的时候我们还需要同时维护一个数组cnt[i]表示i的子树大小(包括它自己),(y是x的儿子)。然后再来一次dfs,遍历到x点的时候,去计算x的每个儿子y的f值,

最后只需要取f[i]的最小值就是答案。

这种解法实际上是利用了换根的思路,即先算出固定某一点为根的答案然后考虑把它的儿子换成根会发生什么样的变化,如果这个变化是比较好算的,那么我们就可考虑每个点x为根的答案都根据以它父亲为根的结果去推。

知道了这样子的思路我们再来看NC51180 Accumulation Degree。

首先,我们来看是不是能求出以某固定点(以1为例)的流量:

我们用flow[i]表示i点的流量:

(j是i的儿子)

这里特别要注意i点是叶子节点的情况,我们可以认为它的flow就是连向它的边流量就可以了。

接着,我们来考虑换根,flow[i]表示以i为根的流量——考虑当根从x变成x的儿子y的时候会发生什么?哪些量边哪些量不变? (想不清楚就画图,做算法题“草稿纸”还是很重要的。)

图片说明

x的流量中没有从y过来的部分了 ,即此时x的流量其实是,但是此时的flow我们用它来表示以i为根的流量了(其实你也可以用另外一个数组存,但是并没有必要),所以并不更新flow[x]。

而x的流量会流向y,注意这里是x的新流量,而不是flow[x]。

特别注意叶子结点,当y是叶子节点的时候没关系,但是当x从根变为了叶子节点(说明x除了y这个儿子没有别的儿子了),它的流量并不是变成的上面的式子,而是直接变成edge[x] [y]。

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

活动奖励:

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

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

.牛币兑换中心

牛客博客开通方式

  1. 如何开通牛客博客:https://www.nowcoder.com/discuss/202952
  2. 如何使用博客搬家功能:进入博客--->设置--->底部博客搬家
  3. 如果你对牛客博客有任何意见或建议:牛客博客意见反馈专贴
全部评论
😎前排占坑
1 回复 分享
发布于 2020-04-12 09:24
https://blog.nowcoder.net/n/383febeb3ac64a7b8e79db81829c9c2e 两道题的题解都写好了 (滑稽)
1 回复 分享
发布于 2020-04-12 09:33
https://blog.nowcoder.net/n/aea4568df5ea41ad87503d9676576155
点赞 回复 分享
发布于 2020-04-12 12:05
https://blog.nowcoder.net/n/036d85b25e8c4d8aab55351f6d7134ca 第二题,第一个待写
点赞 回复 分享
发布于 2020-04-12 12:28
https://blog.nowcoder.net/n/b18a0a476c1c42e39cd8392ea6343e36
点赞 回复 分享
发布于 2020-04-12 13:58
两题 https://blog.nowcoder.net/n/52453d10021b43ba9c5aabfe01369437
点赞 回复 分享
发布于 2020-04-12 14:26
https://blog.nowcoder.net/n/219135e698c14865a806a59698fe4a2a 树学
点赞 回复 分享
发布于 2020-04-12 14:58
https://blog.nowcoder.net/n/8b03fe89d4224967a9e30fe35721d224 每日一题题解 自我觉得很详细。。
点赞 回复 分享
发布于 2020-04-12 16:44
https://blog.nowcoder.net/n/b6954b2e479242f3961bf4aba9aa50a9
点赞 回复 分享
发布于 2020-04-12 19:48
https://blog.nowcoder.net/n/c775ed0b36b948ae9a040eaaea4ca8f4
点赞 回复 分享
发布于 2020-04-12 20:53
树学:https://blog.nowcoder.net/n/7ee93352d51941eeb4b64756070bd1d2 Accumulation Degree:https://blog.nowcoder.net/n/fb26cfa62741440e8fcc2e1eeda267af
点赞 回复 分享
发布于 2020-04-12 22:05
https://blog.nowcoder.net/n/f92143c7f5a2481e9225ba1d938ec39f
点赞 回复 分享
发布于 2020-04-13 09:03
https://blog.nowcoder.net/n/994d60c859bd4afdb24441d38003234a
点赞 回复 分享
发布于 2020-04-13 11:17
https://blog.nowcoder.net/n/a724e49c4ae844e9a8a605ae33614c85
点赞 回复 分享
发布于 2020-04-13 11:28
https://blog.nowcoder.net/n/90f99d0329554c2e9efd054215bc0391 两题都有
点赞 回复 分享
发布于 2020-04-13 13:19
https://blog.nowcoder.net/n/0be8b86c6da94175853888e7db23beea 2题吖 
点赞 回复 分享
发布于 2020-04-13 14:27
https://blog.nowcoder.net/n/2bc4a4d8b4624d70a4bb336f395b785e  这是NC201400树学的题解一题一题来
点赞 回复 分享
发布于 2020-04-13 17:07
https://blog.nowcoder.net/n/9c1d1d57b1a240b7a64619a757550ec2 树学 一个一个来
点赞 回复 分享
发布于 2020-04-13 21:57
https://blog.nowcoder.net/n/930b97381b32412d90aca136acb12423  这是第二题的,昨天发了第一题。   第二题折腾了好久,嘤嘤嘤
点赞 回复 分享
发布于 2020-04-14 15:25
https://blog.nowcoder.net/n/61519e2b30e74c84b7ad17a7639b4ad9 两题一起
点赞 回复 分享
发布于 2020-04-14 16:52

相关推荐

牛舌:如果我不想去,不管对方给了多少,我一般都会说你们给得太低了。这样他们就会给下一个offer的人更高的薪资了。
点赞 评论 收藏
分享
沉淀一会:1.同学你面试评价不错,概率很大,请耐心等待; 2.你的排名比较靠前,不要担心,耐心等待; 3.问题不大,正在审批,不要着急签其他公司,等等我们! 4.预计9月中下旬,安心过节; 5.下周会有结果,请耐心等待下; 6.可能国庆节前后,一有结果我马上通知你; 7.预计10月中旬,再坚持一下; 8.正在走流程,就这两天了; 9.同学,结果我也不知道,你如果查到了也告诉我一声; 10.同学你出线不明朗,建议签其他公司保底! 11.同学你找了哪些公司,我也在找工作。
点赞 评论 收藏
分享
评论
2
1
分享
牛客网
牛客企业服务