【每日一题】4月3日题目精讲 DFS
题号 NC13886
名称 Shortest Path
来源 西南交通大学第十三届ACM决赛
戳我进入往期每日一题汇总贴~
简单说一下汉语题意:
给你一棵 个节点的树(保证 是偶数),你需要将 个节点分为 个点对,使得每个点对的两个点的距离的和最小。
首先我们可以通过观察得到以下几点:
首先,在最短的距离和之中一条边一定不会被覆盖两次,如图,我们一定可以找到一种方法来交换配对,把重复的边去掉(其他的边是不会变的)。也就是说对于一条边来说,其实只有选和不选两种可能。
第二,对于一个点x,它子树中的点一定会尽量在子树中找到匹配的点内部消化掉(要么连父亲要么连兄弟),只有根是有可能会往上找一个点来匹配(不然又会出现重复覆盖一条边的情况)。
那么如果我们不去想点怎么两两配对而是来考虑每个边选不选——对于当前点 ,如果它的子树大小(包括它自己)有偶数个点,那么肯定在子树里面就互相连完了,它不需要向上连;如果是奇数个点, 就需要去匹配上面的点了,所以 向它父亲连的边就要选。然后就没有然后啦!
这个题告诉我们,要善于对题目进行转换,题目让匹配点这个操作是比较困难的,所以我们可以选择通过选边来替代它,问题就简单了。
代码可戳我查看~
看完邓老师的题解,记得自己去做题提高呀~
欢迎各位大佬来做题写题解,也欢迎大家踊跃在当日讨论贴中提问!
活动奖励:
在牛客博客中写出题解,并回复地址
审核通过可获得(依据题目难度和题解的内容而定)
本道题目4月11日中午12:00之前写的题解有获得牛币资格~
牛客博客开通方式
- 如何开通牛客博客:https://www.nowcoder.com/discuss/202952
- 如何使用博客搬家功能:进入博客--->设置--->底部博客搬家
- 如果你对牛客博客有任何意见或建议:牛客博客意见反馈专贴