图论总结

    技术2023-04-12  115

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

    一、最短路

    DijkstraFloydSPFAK短路差分约束系统

    二、最小生成树

    PrmieKruskal

    三、二分图

    定义

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

    定理

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

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

    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为边的数目。

    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

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

    九、差分约束

    Processed: 0.013, SQL: 9