因为图论的知识点是真的杂,稍微写一点东西帮助记忆。后续会慢慢补充。
一、最短路
- Dijkstra
- Floyd
- SPFA
- K短路
- 差分约束系统
二、最小生成树
- Prmie
- Kruskal
三、二分图
定义
设G=(V,{R})是一个无向图。如顶点集V可分割为两个互不相交的子集,并且图中每条边依附的两个顶点都分属两个不同的子集。则称图G为二分图。
定理
- 最小点覆盖数 = 最大匹配数 (这是 Konig 定理)
- 最大独立集 = 顶点数 - 最大匹配数
- 最小路径覆盖数 = 顶点数 – 最大匹配数
3.1 二分图的最大匹配
定义
最大匹配:一个图所有匹配中,所含匹配边数最多的匹配,称为这个图的最大匹配。
例:HDU-1083
3.2 最小点覆盖
定义
点覆盖集合中点的个数最少的S集合,即一个最小的点集,使这个图中所有的点都被这个点集中的点直接连接或者就是这个点。
例:POJ-3041
3.3 最大独立集
定义
最大独立集:在一个独立集中顶点的最大个数称为图G的独立数,即一个最大的点集,集合中的点两两不直接相连。
最大匹配边集是M,那么最大独立集个数|U|=|V|-|M|
例:POJ-2771
3.4 最小路径覆盖
定义
即一个路径集合,使得每一点一定被一条路径覆盖,最小路径覆盖就是集合中最小的路径数量
定理:最小路径覆盖=|P|-最大匹配数
例:POJ-1422
3.5 最佳匹配
定义
边上带权的话,找出权和最大的匹配叫做求最佳匹配(完备匹配)。数学模型:G是加权完全二分图,求总权值最大的完备匹配。
例:HDU 2853
3.5.1 KM算法
四、网络流
4.1 最大流=最小割
- Fold-Fulkerson算法
Fold-Fulkerson算法就是朴素的增广路径思想。
求最大流的过程,就是不断找到一条从源到汇的路径,然后构造残余网络,再在残余网络的基础上寻找新的路径,使总流量增加,然后形成新的残余网络,在寻找新路径… 直到某个残余网络上找不到从源到汇的路径为止。 每用DFS执行一次找路径,增广的操作,都会使得最大流增加,假设最大流为C,那么时间复杂度可以达到 C*(m+n), m为边的数目,n为顶点的数目。
- Edmonds-Karp算法
Edmonds-Karp算法是在Fold-Fulkerson思想上进行改进:
每次寻找增广路径的时候,总是寻找一条从源到汇经过节点数目最少的路径,即最短路径。这是一种“最短增广路径” Shortest Augmenting Path(SAP)的算法。
在实现的时候,每次利用BFS搜索,找到一条从源到汇的最短路径,然后进行增广操作;再进行BFS…直到无法找到从源到汇的路径为止。
时间复杂度可以达到 nmm, n为顶点的数目,m为边的数目。
Dinic算法是网络流最大流的优化算法之一,每一步对原图进行分层,然后用DFS求增广路。时间复杂度是O(n^2*m),Dinic算法最多被分为n个阶段,每个阶段包括建层次网络和寻找增广路两部分。
Dinic算法的思想是分阶段地在层次网络中增广。它与最短增广路算法不同之处是:最短增广路每个阶段执行完一次BFS增广后,要重新启动BFS从源点st开始寻找另一条增广路;而在Dinic算法中,只需一次BFS过程就可以实现多次增广。
4.3 最小费用最大流
五、最大团
六、连通图
6.2 边双联通