这次总共学习了两个板块:图论,数据结构。
文章目录
图论:
拓补排序:将一个DAG里的点放在一个序列里,使得:
- 每个顶点出现且只出现一次。
- 若存在一条从顶点 A 到顶点 B 的路径,那么在序列中顶点 A 出现在顶点 B 的前面。
有些题可以用拓补排序求出一些性质。
P7113 [NOIP2020] 排水系统
此题要计算每个点流入的水流量,在将这些流量平均分配给自己的儿子。我们要用拓补排序求出计算的顺序,再计算。
二分图:
如果将一个图用黑白两色染色,要求相邻的两个点的颜色不一样,就说明这是一个二分图。
欧拉图&欧拉路(回路)
如果一个图度数为奇数的点为 0 0 0 个或 2 2 2 个,那么这个图就是一个欧拉图。欧拉图存在一条路径,使得这条路径能遍历这张图的每一条边恰好一次,如果这张图有 0 0 0 个奇点,那么这张图就存在一条欧拉回路。
欧拉回路的求法:普通 DFS 遍历图,然后在离开一个点的时候将这个点放入栈内,最后去出这个栈里面的元素就行了。这样可以保证路径连续。
MST:
对于一个带权图,将图的边删减到其点个数减一条边,即一棵树,并且使这棵树边权和最小,这棵树就是这张图的最小生成树。
非严格次小生成树:
我们对于每一条不在生成树上的边,加上它,并且去掉原来生成树上两点路径上最大的边,在求一遍和,取最小值,就是次小生成树的边权和。
强联通分量:
如果对于一张图,它的每两个点都可以互相到达,则称此图强联通。强联通分量指把一张图分为若干个子图,使这些子图强联通,且使子图数量尽量少。
求出一张图的强联通分量后,就可以将这张图的每一个强联通分量缩为一个点,得到一个 DAG。
P1262 间谍网络
此题存在两种贿赂情况:一棵树或一个环。将图的所有强联通分量缩为一个点后,就只有第一种情况了。贿赂每一个强联通分量的代价就是分量里面价钱最少的人的代价。对于每一棵树贿赂树根即可。
数据结构
并查集
通过将点合并到一个集合的方式,使得一些操作可以在 log 2 ( n ) \log_2(n) log2(n) 的时间复杂度内完成。应用有:判断联通,启发式合并等。
线段树
可以在很好的时间复杂度内完成亿些区间操作,比如区间求和,区间加,区间乘等等。如果要同时完成区间修改和区间查询要用懒标线段树。有一种线段树,名字忘了,原理是从低往上操作,可以大大缩小常数。
应用:常规区间操作,求逆序对,优化建图等等。