【题解】P7417 图论 贪心
首先路径不要求是简单的所以可以通过反复走一条边使得路径长度 。存在长度为 的路径意味着一定存在长度为 的路径,所以我们只关心一个点的奇最短路和偶最短路。
如果原图是一个二分图,那么每个点要么只存在奇路径要么只存在偶路径,所以只关心最短路。按照 分层后,每个点连接到上一层即可,答案为 。
接下来只考虑原图不是二分图的情况:令到该点的最短路长度为 ,与最短路径奇偶不同的最短路长度为 ,我们需要使得新图所有 和原图相同。
首先有一条边连接的 一定有 ,否则可以用较小者去更新较大者。
所以一个点 只可能和 连边(当然 时 为 自己)。
考察一组 的由来,由最短路的构成,一定满足以下两种情况之一:
- 从 转移来。
-
从 得到 ,从 得到 (当 时 为 自己)。
可连可不连(对于这个点来说)。
特殊情况是 即 号点不需要向 连边。
然后接下来的思路很妙:考虑前面二分图按照 分层,而现在难以按照 分层了,分层的目的是为了将原图分成若干个相对较为独立的部分,现在考虑按照 分层,于是现在只需要考虑每层向上一层连当边和向这一层的前后连的边。
称 为 的“上面”, 为“左边”, 为“右边”,每个点要么连上面,要么同时连左右(右可能是自环)。
接下来考虑一层一层做。
考虑每层的样子一定形如有若干段,如果不是末尾可以连接自环的段的话一定两个端点都可以向上连。如果末尾可以连接自环那么末尾可能不能向上。(因为这些 是由原图求出来的,所以一定存在一种合法的构造,不会存在一个点上面左右都不能连接),如下:
如果一段中的所有点都可以向上连,最优的办法肯定是所有点都向上连,因为这样只需要消耗一条边。
如果一坨点不能向上连,那么一定会向左右连边。考虑从左到右依次处理每坨点:
如果这坨点有一些点已经被左侧连边了,那么连接这些点向右的边会更优,因为只需要连接一条边且能够为右边的点提供一条边。否则一定向上连会更优,向上连只会消耗一条边,而向左右连需要消耗两条边,可以为右边提供一条边,如果右边需要一条边会在考虑到右边的时候连接左边。
证明就是考虑将一坨连接到父亲的点且没有连接左侧的点转为连接到左侧右侧一定是不优的,因为可能可以将一段向父亲连接的点转成向左右连边,但是最左侧的点仍然必须选择向父亲连边,所以无法更优,如下图:
其根本原因在于向左的边一直传递到最左边坨无法减少连边数(最左点必须向上连)而向右的边可能能够在最右边坨连接同坨中的点,一次消耗两个点。
所以分别考虑每层的每段,具体的连边策略如下:
每段的第一坨点,必须来源于上方(连上面)。
如果这坨点有一部分被左侧连接了,那么直接将这坨点连接到右边,采用连接左右。
如果这坨点剩下的可以连接父亲,就连接父亲,否则连接左右两侧,我们在上面分析了,你不会因为这条连向左边的边而将左侧点从连接上方反悔为连接左右。
时间复杂度 。
本文已经结束了。本文作者:ღꦿ࿐(DeepSea),转载请注明原文链接:https://www.cnblogs.com/Dreamerkk/p/17970902,谢谢你的阅读或转载!
【推荐】国内首个AI IDE,深度理解中文开发场景,立即下载体验Trae
【推荐】编程新体验,更懂你的AI,立即体验豆包MarsCode编程助手
【推荐】抖音旗下AI助手豆包,你的智能百科全书,全免费不限次数
【推荐】轻量又高性能的 SSH 工具 IShell:AI 加持,快人一步