冯梓轩图论总结2
图论学习总结 2
拓补排序
当给定的一张图是一张 DAG(有向无环图)时,可以对该图进行拓补排序,在
例题
[POI2015] PUS (Pustynia)
当一些数之间只给定了大小关系,要求一组可行解时,可以考虑使用拓补排序求解。考虑用较小的数往较大的数连边,由于我们想让一个数在满足限制的条件下尽可能的小,所以它的值可以定为比它小的数中的最大值加 1。若存在
如果存在值相同的情况,可以把相同的值放到一个并查集里,看作一个点,统一限制。
【HNOI2015】落忆枫音
先考虑没有环的情况情况怎么做,答案显然为
现在考虑有环的情况。由于正着不好做。所以考虑还是用原来的方式求。设加入新边之后点
不加边之前:
加入边
这明显已经产生了多个环,所以不能考虑将环一个个找出。由于原图是 DAG,所以不管在原图上选出哪些边都不会形成环,因此增加的环在删去
相当于原来可能有多个父亲,但是我只钦定一个。最后把按照原来方式算出的方案数减去
[CSP-S 2020]函数调用
本来我想的是把对一个函数的调用堆积到最后一起计算,但是搞了半天也不会。由于乘法操作是一次把所有数都乘以一个系数,所以最后可以对原值直接操作。现在的棘手问题是加法操作的对象是唯一的,所以加权的系数需要分别计算。由于先前的加法操作在给其对应位置加值后,后续的乘法操作会将其加权的系数扩倍,所以可以将其先后顺序颠倒一下,方便计算。设
这里的
二分图
二分图的判定
染色法,将与自己相邻的点染成不同颜色,如果矛盾则不是二分图。
例题
双栈排序
看到“双”栈,而且还看到要判定无解,很容易想到用染色法判定二分图。考虑如何建模。
根据二分图染色的过程,相邻的点与自己颜色不同,所以图中的边连接了两个属于不同栈的节点。考虑
在染色后就可以得到每个元素归属于哪个栈。由于要求字典序最小,所以考虑贪心,在入栈
欧拉路径
此知识点最难的就是:看出一道题与欧拉路径相关;有欧拉路径进行建模。
例题
POLICE
思路太妙了,实在是佩服能想出来的人。
先考虑所有书都在原书架的情况。由于要尽可能的少用操作
接下来考虑一般情况。对于在其原来书架上的书,我们还是按上述方法,这样可以减少操作
这道题确实很难想到与欧拉回路有关。
宝石装箱
可以发现把宝石或着价值作为点,都无法很好的处理限制,所以考虑以颜色作为点,把在相同箱子的连一条边。
先满足第一个条件,发现和等差数列很类似,直接用宝石
[省选联考 2020 B 卷] 丁香之路
发现其实就是求一条
我们先把
最小生成树
最小生成树常与其他知识点结合,如倍增、树剖、线段树等。
例题
跨越雷区
发现左右边界没有什么用。显然,答案具有二分性,因为大的答案都满足了,小的也能满足,所以考虑二分答案。每个点所管辖的区域都是一个以其为圆心,半径为二分值的一个圆,如果两个圆有交(圆心距离小于二倍半径),则它们中间的区域不能通过,我们可以用一个并查集维护,将这两个点所在并查集合并,再建两个虚点,分别代表上界与下界,再用相似方法连边,最后若上界和下界联通,则说明路被堵死,无法通过。但是由于数据过于毒瘤,无法通过。
考虑二分的过程,发现实际上就是逐渐尝试扩大半径,等到上下界联通后就停止。这其实就是最小生成树,将其跑出后,最小生成树上的最大边就是满足条件的最大圆心距离,将其除以
但是如果用 Kruskal 求解的话,时间复杂度还是带一个
水壶
考虑贪心的思想:能走建筑物就走建筑物,这样可以保证最大值最小。
先跑一遍多源最短路,并记录最短路从哪个点转移过来。如果两条最短路相遇,且两条路径起点不同,就将这两个路径起点相连,这样可以保证两个点之间的最大边权相对较小。然后再用 Kruskal 重构树,将环上不必要的大边去掉,最后答案即为
强连通分量(SCC)
主要技术就是缩点,缩点之后是一张 DAG,可以在上面跑拓补,然后和 DP 等算法配合。
例题
狼人游戏
可以发现,在一个 SCC 中,只要问一个点,就可以知道所有点的情况。所以先把图缩点,然后发现知道了一个 SCC 的情况后,它的后继节点也可以知道了,所以只有入度为
最后的答案计算,假设总共需要问
交通网络
本来以为能访问的区间不是一段连续的,那这么做就会超时。但是由于 图是一张平面图,所以有一个很重要的性质:一个左部点能到达的右部点按照
双连通分量(DCC)
双连通分量有一个很好的性质:缩点之后是一棵树。边双的缩点与强连通分量类似,这里主要介绍点双缩点:Block-Cut Tree。
Block-Cut Tree
由于一个割点可能存在于多个点双中,所以不能简单的把点双缩成一个点。但是我们可以考虑 把点双中不是割点的点缩成一个点,然后再和点双中的割点连边。
如下图,原图为:
进行缩点(每个点双中,非割点的点缩点后选择一个原来的点编号作为新编号)后:
这样,图就变成了一棵树,可以进行一些方便的操作。
例题
[AHOI2005] LANE 航线规划
正着做显然不好做,考虑向并查集一样,把正删边改为倒加边。由于边双内的边和点都不会产生贡献,所以将边双缩点,之后就能得到一棵树。考虑加边,树上在加了一条边后,会且仅会产生一个环,而环上的边(即在两点路径上的边)都不会再是割边,贡献从
「CEOI2017」One-Way Streets
一个很显然的性质:边双中的边不用定向,因为边双中两点间有至少两条边不重复的路径,所以有多条可行路径,没有必须经过的边。所以将边双缩点,得到一棵树。从树根开始对树进行遍历,实质上就已经根据点的访问顺序将树边定向。接下来,考虑将从
小结
图论,实际上最难的一般不是在图上求解问题,而是 找出题目与图的关系,将元素之间的关系抽象成图,将原问题转化为图上的等价问题进行求解。所以,多数图论题难就难在建模,如欧拉路径相关题目,需要勤加练习才能总结出一些经验,同时也需要灵活的思维才能找到联系。
【推荐】国内首个AI IDE,深度理解中文开发场景,立即下载体验Trae
【推荐】编程新体验,更懂你的AI,立即体验豆包MarsCode编程助手
【推荐】抖音旗下AI助手豆包,你的智能百科全书,全免费不限次数
【推荐】轻量又高性能的 SSH 工具 IShell:AI 加持,快人一步
· TypeScript + Deepseek 打造卜卦网站:技术与玄学的结合
· 阿里巴巴 QwQ-32B真的超越了 DeepSeek R-1吗?
· 如何调用 DeepSeek 的自然语言处理 API 接口并集成到在线客服系统
· 【译】Visual Studio 中新的强大生产力特性
· 2025年我用 Compose 写了一个 Todo App