如果说金钱是商品的价值尺度,那么时间就是效率的价值尺度。因此对于一个办事缺乏效率者,必将为此付出高昂代价。——培根
最短路
Dijkstra
Johnson全源最短路(如何用Dijkstra跑带负权的图)
- 通常带负环、负权边的最短路问题都是用 S p f a Spfa Spfa 或 F l o y d Floyd Floyd 求解,但两者的时间显然过大。普通 D i j k s t r a Dijkstra Dijkstra 基于贪心思想,要求图中边都是正权。
- J o h n s o n 全源最短路 Johnson全源最短路 Johnson全源最短路 可以在预处理后在 O ( m l o g m ) O(mlogm) O(mlogm) 的时间内用 D i j k s t r a Dijkstra Dijkstra 跑带负权边的图
洛谷:P1875 佳佳的魔法药水(有向有环图 + Dijkstra变式)
- 虽然堆优化 Dijkstra 很好用,但也不要忽视了 朴素版 Dijkstra 的本质。
- 结合二进制的最短路
Floyd
Floyd 是结合了图论的 dp
Acwing:344. 观光之旅(Floyd求最小环 + 环路径记录)
2021辽宁省大学生程序设计竞赛 B. 阿强的路(多条件状态转移 + Floyd变式)
洛谷:P1730 最小密度路径(多条件状态维护 + Floyd变式 + 枚举维护最优子结构)
洛谷:P1476 休息中的小呆(Floyd求最短路 + 升序记录路径)
P1522 [USACO2.4]牛的旅行 Cow Tours(Floyd多源最短路)
Spfa 求负环 / 01分数规划 / 差分约束
除了求负环外,偏向数论的较难的一节
二分答案
- 在某些特定限制下求最短路问题,通过观察可以发现限制对于答案具有二分性质,以此来节省时间。
- 当然数据大的时候用二分,小的时候也可以直接枚举。
P1948 [USACO08JAN]Telephone Lines S(电话线路)
- 经典二分答案题,通过将限制映射到边权上,把边权指定为 0 或 1 来二分
分层图
分层图是一种类似 dp 的思想,但又很特殊,是将图进行层次拆分后再处理相应问题,层与层之间不会相互影响,因此保证了独立性。这类问题数据范围通常都不大。
- 分层图入门 + Djikstra
- 图上dp,单层信息不足以存储,那就得分多层。
正反图应用
在最短路问题中,建正反图的处理通常有奇效。
洛谷:P5304 [GXOI/GZOI2019]旅行者(二进制暴力枚举 / 建反图染色法)
- 此题可以证明正反图处理的正确性,也有二进制枚举的暴力解法。
洛谷:P2685 [TJOI2012]桥(正反图、区间维护)
- 正反图跑出两个最短路树结构,在交织中观察出区间维护性质,用线段树处理,难度较高。
路径记录
在维护最短路的过程中,最短路上点的信息也是可以存储下来的。
洛谷:P2832 行路难(堆优化Dijkstra(错解)bfs(正解) + 记录路径)
- 此题的独特性质导致记录路径需要用 bfs (通常是维护 父节点 数组)
DP
最短路结合 dp 也是很常见的应用。
洛谷:P1772 [ZJOI2006]物流运输(最短路 + dp)
- 最短路 + dp,数据很小
洛谷:P3953 [NOIP2017 提高组] 逛公园(图上dp、记忆化搜索)
- 省选dp,记忆化搜索和判环的含金量
洛谷:P3556 [POI2013]MOR-Tales of seafaring(拆点 + 奇偶最短路)
- 类似状态机 dp 去维护两种最短路。包含简单路径的定义。
- 杂合了很多内容的最短路,难度较高,建图的过程用到 dp 思想,用递归处理非常巧妙。
Codeforces周赛 #765 (Div.2):C. Road Optimization(线性DP / 图论)
- 图建好,跑最短路的过程也是 dp 的一种形式
染色法 —— 二分图
染色法应用领域不少,用以处理独特性质的 “黑白” 图。与二分图密切相关。
染色
洛谷:P1155 [NOIP2008 提高组] 双栈排序(二分图、模拟)
- 此题不仅要在题目中挖掘出二分图性质,还要模拟栈的运行过程,容易出错。
2021 ICPC 区域赛(沈阳)B-Bitwise Exclusive-OR Sequence(异或环、二分图染色变种、贪心)
- 不错的染色法应用题,涉及异或数学知识的染色,空间大小要注意。
洛谷:P1330 封锁阳光大学(二分图染色 + 最小同色点覆盖)
- 最小点覆盖是指:最小的点覆盖图中所有边,点集中的点有可能相邻。
- 二分图性质:没有奇数环存在,若有,必定有点可以通过走奇数环来变色。
二分图匹配
匈牙利算法,跟网络流沾边
拓扑序列
有向无环图 —— DAG,又称拓扑图。在有向无环图中可以用 dp 解决很多问题
洛谷:P6560 [SBCOI2020] 时光的流逝(博弈、拓扑序列)
- 结合博弈论的拓扑,在入队操作上有所改变
洛谷:P3243 [HNOI2015]菜肴制作(拓扑序列、建反图、贪心)
- 建反向边 + 贪心 来处理特殊顺序的拓扑
- 用拓扑判断有无解。
强连通 / 双连通
将有向或无向图中的环缩成点,这样一个有向有环的图就会转化成 DAG,以此解决部分问题。
洛谷:P1262 间谍网络(强连通缩点 + 拓扑序维护信息)
- 题目信息要考虑全,思考所有数据情况。
欧拉路径
只经过一张图中所有边一次走完这个图,这个图就是欧拉图,俗称一笔画问题
洛谷:P2407 [SDOI2009]地图复原(标记欧拉回路)
图的遍历
【2021四川省赛】E.Don’t Really Like How The Story Ends(图的 dfs 遍历)
- 考察对 dfs 遍历的理解
- 不是染色法,但模拟染色的过程,用并查集维护使得时间可以接受。
洛谷:P1653 猴子(图存储、逆向思维 删边 -->加边)
- 考察反向处理询问
- 比较特别的一道搜索题(分类为图论?理论上也是图)
- 遍历图时,可以通过标记已经走过的路径来减少时间,使得整个图只被走一次
洛谷:P1444 [USACO1.3]虫洞 wormhole(找环 + 枚举暴搜)
- 搜索时,对点和边搜索的安排,和顺序安排会有奇效