图论总结——拓扑排序
图论总结——拓扑排序
例 :排水系统(不是很模板的模板题)
思路
模板题,但是要进行分数约分,所以又不是很模板直接进行计算即可。注意计算过程中很可能爆
点击查看代码
你被骗了
例 :菜肴制作
思路
套路题,考虑正面直接模拟不是很好做,现在考虑在反图上用贪心的思想做。
我们发现一个性质,如果现在有一个菜品编号较大的菜,那么我们就要尽量让菜品编号比它小的菜在它的前面,这样做肯定是满足题意的最优解。
利用上述性质就可以完成题目了,具体地,考虑反图代表的实际意义为,做这个菜之前要做哪些菜,所以进行拓扑的意义就为确定从最后依次往前做那些菜,那么我们就先在反图上求字典序最大的拓扑序,最后再反过来就一定为最终的解。
下面我们来进行证明这个贪心的正确性:
定义两个拓扑序中更优的一个为“最小序”更小的拓扑序。
求证:一个 DAG 的拓扑序中“最小序”最小的的一个拓扑序,是反向字典序最大的一个。
证明:
首先,当
其次,假设结论对于
特别地,有
证明:由于
所以
现将整个图可以分成三个子图,其点集分别为
由于
因为
所以对于任意的 DAG,由数学归纳法得结论均成立。
证毕。
点击查看代码
你被骗了
例 :PUS (Pustynia)
思路
题目似乎看起来像数学题,其实不然,这与图论最短路中的一个经典应用有关——差分约束。
我们利用最短路的性质,如果一个整数 开心地根据题意模拟对每个点进行建边即可。
显然直接按照题意模拟建边的复杂度就为
考虑进行一个小优化,每一个区间创立一个虚拟节点,其中
思考还可以怎么优化,看到一个点向一个区间连边,可以使用线段树高效解决此类建图问题,最终时间复杂度为
点击查看代码
你被骗了
例 :Elaxia的路线
思路
先分别把关于两对起点和终点的最短路图求出来,再取交集,然后进行
那么可以考虑对求出来的最短路图的交集搞个方向,这样就能进行
那么我们就可以进行分类讨论,固定一对起点和终点的最短路图的方向,另外一对起点和终点再判断是并行还是相遇的类型。
点击查看代码
你被骗了
例 :数列恢复
思路
考虑可以把
实际上本质就是差分约束。
当然无解情况之一就是图中有环存在,即
方法一:构造+判定
先不管
具体地,注意我们最后的
又因为图中没有环,所以可以进行拓扑排序求出
当然到这一步还没有结束,我们的做法似乎是假的,因为我们没有考虑
点击查看代码
你被骗了
方法二:并查集
当
点击查看代码
你被骗了
【推荐】国内首个AI IDE,深度理解中文开发场景,立即下载体验Trae
【推荐】编程新体验,更懂你的AI,立即体验豆包MarsCode编程助手
【推荐】抖音旗下AI助手豆包,你的智能百科全书,全免费不限次数
【推荐】轻量又高性能的 SSH 工具 IShell:AI 加持,快人一步
· 分享一个免费、快速、无限量使用的满血 DeepSeek R1 模型,支持深度思考和联网搜索!
· 使用C#创建一个MCP客户端
· 基于 Docker 搭建 FRP 内网穿透开源项目(很简单哒)
· ollama系列1:轻松3步本地部署deepseek,普通电脑可用
· 按钮权限的设计及实现