图论总结

因为图论的知识点是真的杂,稍微写一点东西帮助记忆。后续会慢慢补充。

一、最短路

  • Dijkstra
  • Floyd
  • SPFA
  • K短路
  • 差分约束系统

二、最小生成树

  • Prmie
  • Kruskal

三、二分图

定义

设G=(V,{R})是一个无向图。如顶点集V可分割为两个互不相交的子集,并且图中每条边依附的两个顶点都分属两个不同的子集。则称图G为二分图。

定理

  1. 最小点覆盖数 = 最大匹配数 (这是 Konig 定理)
  2. 最大独立集 = 顶点数 - 最大匹配数
  3. 最小路径覆盖数 = 顶点数 – 最大匹配数

3.1 二分图的最大匹配

定义

最大匹配:一个图所有匹配中,所含匹配边数最多的匹配,称为这个图的最大匹配。

例:HDU-1083

3.1.1 匈牙利算法(dfs)

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 最大流=最小割

  1. Fold-Fulkerson算法

Fold-Fulkerson算法就是朴素的增广路径思想。

求最大流的过程,就是不断找到一条从源到汇的路径,然后构造残余网络,再在残余网络的基础上寻找新的路径,使总流量增加,然后形成新的残余网络,在寻找新路径… 直到某个残余网络上找不到从源到汇的路径为止。 每用DFS执行一次找路径,增广的操作,都会使得最大流增加,假设最大流为C,那么时间复杂度可以达到 C*(m+n), m为边的数目,n为顶点的数目。

  1. Edmonds-Karp算法

Edmonds-Karp算法是在Fold-Fulkerson思想上进行改进:

每次寻找增广路径的时候,总是寻找一条从源到汇经过节点数目最少的路径,即最短路径。这是一种“最短增广路径” Shortest Augmenting Path(SAP)的算法。

在实现的时候,每次利用BFS搜索,找到一条从源到汇的最短路径,然后进行增广操作;再进行BFS…直到无法找到从源到汇的路径为止。

时间复杂度可以达到 nmm, n为顶点的数目,m为边的数目。

3. Dinic算法

Dinic算法是网络流最大流的优化算法之一,每一步对原图进行分层,然后用DFS求增广路。时间复杂度是O(n^2*m),Dinic算法最多被分为n个阶段,每个阶段包括建层次网络和寻找增广路两部分。

Dinic算法的思想是分阶段地在层次网络中增广。它与最短增广路算法不同之处是:最短增广路每个阶段执行完一次BFS增广后,要重新启动BFS从源点st开始寻找另一条增广路;而在Dinic算法中,只需一次BFS过程就可以实现多次增广。

4.2 最大权闭合子图

4.3 最小费用最大流

4.4 区间K覆盖

五、最大团

5.1 Bron-Kerbosch

六、连通图

6.1 Tarjan强连通

6.2 边双联通

七、2-SAT

八、欧拉回路和哈密顿回路

九、差分约束

你可能感兴趣的:(图论)