【学习笔记】优化建图
在最短路、强连通分量、2-SAT、网络流等图论问题中,边数有时达到 甚至 ,成为时间或空间复杂度的瓶颈所在,使用优化建图可以在不影响效果的情况下建出边数更少的图。
线段树优化建图#
建图方法#
支持以下四种操作:
-
连边
-
连边
-
连边
-
连边
区间操作想到线段树,可以把区间拆成 个线段树上区间。先按照线段树建出两棵树:外向树和内向树。对于所有连入一个区间的操作,将边连向外向树,这代表着连入一个大区间的边在经过外向树边后,也可以连入小区间;对于所有从一个区间连出的操作,将边从内向树连出,这代表着一个小区间在经过外向树的边后,可以连出大区间的边。
为了避免冲突,将外向树的编号从 开始,内向树的编号从 开始,单个节点的编号从 开始,且要与两棵树的叶子相连。
区间与区间相连按照上面做法是 条边,可以新建两个节点以一条边相连,将边权设置在这条边上。内向树对应区间全部由其中一个节点连入,外向树对应区间全部连到另一个节点,这样就只有 条边。
总点数大概在 左右,总边数是 级别。
例题#
CodeForces-786B Legacy *2300#
没有区间连区间,建图完跑最短路,复杂度 。
Luogu-P6348 PA 2011 Journeys#
只有区间连区间,优化建图后跑 01 BFS。
Luogu-P8021 ONTAK 2015 Bajtman i Okrągły Robin#
二分图最大权匹配,转成费用流模型,把代表时刻的右部点优化建图。
Luogu-P5025 SNOI 2017 炸弹#
先缩点,注意到每个强连通分量一定是连续区间,那么可以波及的范围也是连续一段区间,只需求出可达的端点,拓扑转移。
缩点过程用线段树优化建图。
前后缀优化建图#
建图方法#
可以用于连边区间序列的前后缀或树上根链的情况。
对于序列的前后缀,可以对每个节点 新建两个复制节点 ,连边为 ,这样当需要连前缀 时,直接同 相连即可,后缀同理。
对于树上根链,直接建内向树,连根链末尾即可。
例题#
Luogu-P6378 PA 2010 Riddle#
2-SAT 模型,第一类边是 级的,注意到连边为整个集合除了本身的所有节点,就是一个前缀一个后缀。
Luogu-P6965 NEERC 2016 Binary Code#
先建出 Trie 树,若一个串有 ?
则将两种可能都插入。
设 分别表示第 个串填 或 这一事件以及在 Trie 树上结束的位置,暴力做法是如果 和 在 Trie 树上有祖先关系,那么 连边,跑 2-SAT。
先考虑 的情况,即二者有祖先关系但不重合,连边可以视作 向一个前缀所有 连边,一个前缀 向所有 连边。
考虑前缀优化,分别建出内向树和外向树,在内向树中,,这样连 就是第一种连边;在外向树中,,这样连 就是第二种连边。
的情况就是在一个节点内部连边,看做序列,连边就是与自己以外的相反状态相连,这也是一个前后缀优化。
需要特殊考虑不含 ?
的情况,若两个不含 ?
的串有前后缀关系直接不合法,若一个不含 ?
的串与一个含 ?
的可能结果有前后缀关系就连 。
注意 Trie 树的节点数可能大于 。
点数和边数巨大,但是可以通过。
作者:SoyTony
出处:https://www.cnblogs.com/SoyTony/p/Learning_Notes_about_Graph_Construction_Optimization.html
版权:本作品采用「署名-非商业性使用-相同方式共享 4.0 国际」许可协议进行许可。
【推荐】国内首个AI IDE,深度理解中文开发场景,立即下载体验Trae
【推荐】编程新体验,更懂你的AI,立即体验豆包MarsCode编程助手
【推荐】抖音旗下AI助手豆包,你的智能百科全书,全免费不限次数
【推荐】轻量又高性能的 SSH 工具 IShell:AI 加持,快人一步
· 单线程的Redis速度为什么快?
· 展开说说关于C#中ORM框架的用法!
· Pantheons:用 TypeScript 打造主流大模型对话的一站式集成库
· SQL Server 2025 AI相关能力初探
· 为什么 退出登录 或 修改密码 无法使 token 失效