图论复习
图论复习
强连通分量
对于一个有向图
将有向图
tarjan 所提出的基于 dfs 求强连通分量的方法,本质上是暴力遍历图找到所有的有向环,然后对于每个点,将经过该点的有向环上的节点归入同一个强连通分量中。只不过对于已经遍历到的节点进行了记忆化,保证了复杂度。
显然缩点以后的图是一个拓扑图。
点双连通分量与割点
对于一个无向图
将无向图
对于无向图
显然两个点双之间是通过割点连接的(因为删掉
tarjan 提出的基于 dfs 求点双连通分量的本质依然是暴力找环。对于一个节点,若经过它的以 dfs 的方向为方向的有向环的所有节点在dfs树上都不是它的祖先,那么显然它是一个割点。当然,需要特殊处理根节点。
需要注意的是在 dfs 的过程中一个节点可能多次被置为割点,因此统计割点的个数应该在 dfs 结束以后再行统计。
边双连通分量与割边
对于一个无向图
将无向图
对于无向图
类似点双与割点的关系,两个边双之间是通过割边连接的。因此找到割边就可以找到边双了。
tarjan 提出的求边双连通分量的算法本质依然是暴力找环,只不过一条边是割边当且仅当这条边的出点所在的所有沿 dfs 方向的有向环都不能回到这条边的入点,那么该边是割边。因此应该把割点的判断条件 low[v] >= dfn[u] 改为 low[v] > dfn[u]。
2-sat问题
给定
考虑建图,对每个变量
这样,一条
显然如果存在一条
考虑如何输出方案,缩点后,对于变量
需要注意的是,在建边时一定要建出逆否命题对应的边,否则正确性是不对的。
差分约束系统
给定
考虑建图,注意到
当图中有负环时,相当于出现了一个
如果不等式的符号是大于号,直接在两侧同乘
Kruskal 重构树
在进行 Kruskal 的过程中,将新加入的边当作一个点,将所联通的两个连通块作为左右子树。这样就得到了一棵
主要在处理瓶颈路有关问题的时候会有不错的效果。
欧拉路
欧拉通路指一条经过图中每条边且每条边只经过一次的通路。
欧拉回路首先是一条欧拉通路,并且还要求满足通路的起点与终点相同。
无向图存在欧拉回路的充要条件是图中没有度数为奇数的节点。
无向图存在欧拉通路的充要条件是图中存在欧拉回路或图中度数为奇数的节点有且仅有两个。对于后者,欧拉通路的起终点一定是这两个节点。
有向图存在欧拉回路的充要条件是图中所有节点出入度相等。
有向图存在欧拉通路的充要条件是图中存在欧拉回路或者只存在两个出入度不同的节点,其中一个节点出度比入度大一。对于后者,欧拉通路的起点一定是出度比入读大一的节点。
求出一条欧拉路的方法是直接 dfs,标记未通过的边即可。
图论有关概念
注意下述概念和定理适用于任意图,而不只是二分图。
匹配
匹配指的是图
最大匹配指的是边数最多的匹配子图。
交错路:指
增广路:指第一条边和最后一条边都不属于
增广路定理:
点覆盖
点覆盖指的是图
最小点覆盖指的是点数最小的点覆盖子图。
边覆盖
边覆盖指的是图
最小边覆盖指的是边数最小的边覆盖子图。注意到概念不适用于存在度数为
(点)独立集
独立集指的是图
最大独立集指的是点数最多的独立集子图。
二分图
匈牙利算法实现的二分图匹配的正确性是基于增广路定理的,是一个绿与被绿的过程,其时间复杂度为两个点集大小之积,但是跑不满上界。
下面介绍三个二分图常用性质
- 最小点覆盖 = 最大匹配。
- 最小边覆盖 = 顶点数 - 最大匹配。
- 最大独立集 = 顶点数 - 最小点覆盖。
第三条也适用于带权图的情况。
对于不带权的二分图,第三条的证明方式是二分图的点覆盖与独立集是一一对应的。具体的,一个图去掉一个点覆盖中的节点以后,剩下的节点必然是一个独立集。
网络流
东西有点多……
这里写了一个网络流24题一句话题解,剩下有别的什么东西有空再补充叭……