P5659-[CSP-S2019]树上的数【贪心】
1|0正题
题目链接:https://www.luogu.com.cn/problem/P5659
1|1题目大意
给出个点的一棵树,每个节点上有一个数字,你每次可以选择一条边删除然后交换连接的两个点的数字,在删完所有数字后设表示数字所在节点编号,要求使得排列的字典序。
1|2解题思路
好阴间的题目
考虑对与一个点的转移肯定是如下图类似的情况并且每个点连接的边的删除顺序是独立的(如果不独立证明出现了环,树上显然没有环)
考虑上图我们发现产生的数字搬运是,而边的删除顺序是(红色箭头画反了)。不难发现的是因为必须删除所有边,所以最后肯定是和它周围的节点连接形成一个搬运环。
然后因为字典序最小,所以考虑贪心,如果快速对于判断上的数字能否搬运到上。
先考虑在路径上(不包括)的节点需要满足的条件,记上一个节点为,下一个节点为。
- 如果有数字走或者搬运过那么不行
- 如果边或者正反都搬运过数字那么不行
- 如果此时对于节点的边中加上这条边后形成了一个环且不是所有及其周围的数字都在环上的话那么显然不行。
- 如果边已经要求在之后再删除了那么显然不合法(也就是红色的箭头形成了环)
对于根节点和终止节点则类似只是减少了上面第个要求因为显然这条边必须是最早/最晚删除的。
然后用类似链表的结构来维护每个节点连出去边的情况来判断后两个条件,前两个条件则很好判断。并且如果保证了对于每个节点都满足它上面的数字不会搬回自己所在处就可以保证所有边必须删除了。
然后每次从未确定的最小的数字所在节点出发搜索所有合法的终止节点然后拿最小值再沿路更新即可。
时间复杂度:
1|3code
__EOF__

本文作者:QuantAsk
本文链接:https://www.cnblogs.com/QuantAsk/p/15399158.html
关于博主:退役OIer,GD划水选手
版权声明:本博客所有文章除特别声明外,均采用 BY-NC-SA 许可协议。转载请注明出处!
声援博主:如果您觉得文章对您有帮助,可以点击文章右下角【推荐】一下。您的鼓励是博主的最大动力!
本文链接:https://www.cnblogs.com/QuantAsk/p/15399158.html
关于博主:退役OIer,GD划水选手
版权声明:本博客所有文章除特别声明外,均采用 BY-NC-SA 许可协议。转载请注明出处!
声援博主:如果您觉得文章对您有帮助,可以点击文章右下角【推荐】一下。您的鼓励是博主的最大动力!
【推荐】国内首个AI IDE,深度理解中文开发场景,立即下载体验Trae
【推荐】编程新体验,更懂你的AI,立即体验豆包MarsCode编程助手
【推荐】抖音旗下AI助手豆包,你的智能百科全书,全免费不限次数
【推荐】轻量又高性能的 SSH 工具 IShell:AI 加持,快人一步
· .NET Core 中如何实现缓存的预热?
· 从 HTTP 原因短语缺失研究 HTTP/2 和 HTTP/3 的设计差异
· AI与.NET技术实操系列:向量存储与相似性搜索在 .NET 中的实现
· 基于Microsoft.Extensions.AI核心库实现RAG应用
· Linux系列:如何用heaptrack跟踪.NET程序的非托管内存泄露
· TypeScript + Deepseek 打造卜卦网站:技术与玄学的结合
· 阿里巴巴 QwQ-32B真的超越了 DeepSeek R-1吗?
· 【译】Visual Studio 中新的强大生产力特性
· 张高兴的大模型开发实战:(一)使用 Selenium 进行网页爬虫
· 【设计模式】告别冗长if-else语句:使用策略模式优化代码结构