一、最短路
最短路常见算法包括堆优化Dijkstra、Bellman-Ford、SPFA、Floyd。
Dijkstra的时间复杂度为O(mlongn),但是但是不能处理负边权。
基于“松弛”操作(或称三角形不等式)的Bellman-Ford时间复杂度为O(nm),可以处理负边权。队列优化的Bellman-Ford,即SPFA,时间复杂度降到了O(km)(k通常为一个较小的常数),但是在特殊构造的图(比如网格图)中容易退化,因此有的大佬建议尽量不要在正式比赛中使用SPFA。
SPFA也可用于差分约束系统,将在第十部分讲解。
与前三种基于贪心的单源最短路不同,基于动态规划的Floyd是一种多源最短路算法,还可以用于求传递闭包等,但时间复杂度达到了O(n3),无法处理较大的数据。
考场上一般不会考裸的最短路,次短路和最短路计数估计也不常考。我个人觉得真正可能作为考题出现的是最短路树,即由某一点出发的最短路上的边构成的树。众所周知,树拥有许多优秀的性质,也因此常常作为考点。放上几道题:
WOJ#3771 「一本通 3.1 例 1」黑暗城堡(比较裸的最短路树)
WOJ#2423 安全出行Safe Travel(USACO的题)
WOJ#4709 迷路(某道校内模拟赛题)
最短路也可以与其它算法结合:
WOJ#3841 双调路径(多维spfa)
WOJ#2498 盛夏的果实(二分+spfa)
二、最小生成树
最小生成树(MST)常见算法有Prim、Kruskal,时间复杂度都差不多,在O(mlogm)左右。
同最短路一样,裸的最小生成树也不常考,但是我们可以将树链剖分套到MST上(毕竟都有树了嘛),比如这几道题:
WOJ#3775 次小生成树
WOJ#4323 mst(bzoj2238)
此外,各类生成树也是OI中的一大考点,比如:
最优比率生成树:WOJ#1070 GREEN重修家园QUAKE(USACO的题,也是0/1分数规划的一个应用)
xor最小生成树:WOJ#3384 XOR生成树(运用Trie树解决)
动态最小生成树:WOJ#4482 [WC2006]水管局长(上LCT)
最小乘积生成树:WOJ#3778 [Balkan 2011]Timeismoney(bzoj2395)(图论与计算几何的结合)
最小生成基环树森林:WOJ#4097 【2018NOIP提高测试1016】华莱士(并查集)
上述的各类生成树主要是关于无向图的,而对于有向图,我们有最小树形图,可以用朱刘算法解决。例如:
WOJ#4104 【模板】最小树形图
三、拓扑排序
拓扑排序通常用于有向无环图(DAG)中,用BFS实现。
拓扑排序的难点在于怎样找到一个合适的拓扑序来解决实际问题,比如:WOJ#2886 【HNOI2015】菜肴制作。
四、欧拉回路
主要是那几个性质和定理,感觉也不知怎么考,至于例题,一本通提高篇上的都不错。
五、LCA
找最近公共祖先(LCA)是一个比较基础的操作。可以用倍增求,但是树链剖分求LCA可以在预处理时少一个log,但是码量++。
很多需要用到树的题都需要LCA,比如前面提到的WOJ#4709 迷路,还有这道:WOJ#2723 简单题(LCA与Kruskal的结合)。
六、图论连通性
OI中的一大难点。主要考割点与桥,点双连通分量与边双连通分量,强连通分量,缩点。其实如果把这些概念搞清楚的话,这部分也不是很难,毕竟这一部分有一个通用的算法——tarjan。tarjan基于搜索树实现,通过维护时间戳和回溯值(即从该点经过一条不在搜索树上的边所能到达的时间戳最小的点的时间戳)来实现上述操作,时间复杂度为O(n+m)。至于缩点,直接建立一个虚点来代表一个连通分量即可。放上一些例题:
WOJ#1639 嗅探器(ZJOI 2004)(关于如何求两点间的割点)
WOJ#2037 [HNOI2012]矿场搭建(稍有难度的一道题)
WOJ#1435 抢掠计划(APIO2009)(缩点例题)
tarjan还可以用于2-Sat问题的求解,将在第十部分讲解。
此外,可利用Lenguar-Tarjan算法通过计算支配树在O(nlogn)的时间内求出有向图从指定起点出发到每个点的必经点集。例题:
WOJ#1771 灾难
七、二分图与网络流
二分图和网络流部分有很多概念需要搞清楚。这部分难点其实不在于算法本身,而在于如何建图,将在第十部分讲解。
此外,网络流也是可以与树结合的,比如洛谷模板区的这道P4897 最小割树。
八、基环树
基环树主要考的是dp,通常把环上的情况特殊讨论一下即可。比如:
WOJ#3629 island(求直径)
WOJ#1753 骑士
当然最小字典序遍历也是考过的:WOJ#4228 旅行(NOIP2018提高组Day2T1)。
九、仙人掌
省选知识,这部分我还没怎么学,只看了一下圆方树。暂时咕咕咕吧。
十、建图
实际上这一部分才是图论中最难的。
1、优化建图
主要包括线段树优化建图和Kruskal重构树(还没怎么写)。先放几道题:
CodeForces - 786B Legacy(线段树优化建图的典例)
WOJ#2723 简单题(也可以上Kruskal重构树)
WOJ#4147 【2018NOIP提高测试1026】naive 的图
2、分层图
实际上是一种升维策略,即通过将原图复制若干层,并赋予每一层不同的状态,从而达到简化问题的效果。例题:
WOJ#2698 走迷宫
WOJ#3408 「网络流 24 题」孤岛营救问题(可以不用网络流)
WOJ#2415 改造路Revamping Trails(USACO的题,也可以用DP+最短路)
3、差分约束系统
差分约束系统实际上是对三角形不等式的一个变形。对于一组不等式,我们可以借此将其转化为两点之间的连边,然后就可以通过判断负环来确定这组不等式有没有解。不过这里使用的判断负环spfa是深搜或双端队列版的spfa,它们在判断负环时效率更高。例题:
WOJ#2239 奶牛的站位Layout(USACO的题)
4、2-Sat
实际上就是给出n个组(每组包含两个元素)和m个互斥关系,从每个组里选择一个使得这些关系都不满足。这类问题有一个基本的建模:若i和j互斥,那么i向j'连边(选i不选j),j向i'连边(选j不选i)。例题:
WOJ#2101 【POI2001】和平委员会(典例)
5、二分图和网络流的建图
这部分的建图思路就是把各种限制转化为容量,把权值转化为费用,有时还需要拆点为边。例如:
WOJ#1243 蜥蜴 lizard(SCOI 2007)
WOJ#4728 航线
WOJ#4737 Oleg and chess
网络流24题
6、一些你可能以为不是图论但实际上是图论的题
这类题目的难点在于你可能根本没看出来它是图论题。如果你看出来了,这类题一般不会太难。例如:
WOJ#4260 【ARC084D】Small Multiple
WOJ#3993 墨墨的等式
WOJ#4727 return
WOJ#4729 五彩斑斓
来源:https://www.cnblogs.com/doyo2019/p/11707853.html