序言
基本是对ix35整理内容的抄写。所以你会发现大量的重合。
只有一些不偏向定义的才会用自己能更好理解的话解释出来。
所以一些证明会相比其他人说明更加繁琐,不过这是写这篇文章此时的我能力内的理解,如果将来有更好的理解,能从更高的角度 / 从更简洁的语言出发,还会更新。
定理和推论,构造方案相关,也就是除去定义和证明以外比较重要的内容,都加粗了,复习的时候可以直接看加粗的内容。
二分图
二分图
定义
对于无向图 ,若存在将 划分成两个不相交子集 的方案,使得 的点导出子图都不含边,则称 为二分图, 为 的两部。
即 .
根据定义,我们可以得出二分图是可以被二染色的图,即把每个节点着黑白两色之一,使得每条边的两个端点颜色不同,这等价于二分图的定义。
定理:图 为二分图,当且仅当 中不存在长度为奇数的环。
注:这里讨论的环如无特殊说明均为简单环,具体标准定义参考 oi-wiki。
可以用二染色来证明这个定理。
若 中存在长度为奇数的环 ,那么将 染成黑色(黑白两色是对称的),那么 一定要染成白色。以此类推, 都要染成黑色,由于 和 相邻,所以该图不能被二染色,则该图不是二分图。必要性得证。
若 中不存在长度为奇数的环,由于各个连通分量之间相互独立,考虑其中任意一个连通分量:求出任意一棵生成树,对于生成树上奇数深度的点染成黑色,偶数深度的点染成白色,由于不存在奇环,则相同颜色点之间必然没有边相连,即得到一个二染色方案,则该图是二分图。充分性得证。
推论:二分图 的任意子图都为二分图
推论:图 是二分图当且仅当其每个连通分量都是二分图。
证明是比较显然的,因为图 是二分图则其任意子图中都不存在奇环;图 不存在奇环等价于其各个连通分量里都不存在奇环。
至此,我们可以得出判断一张图是否为二分图的算法:
- 对于图 ,根据第二条推论,只需要判断每个连通分量是否是二分图。
- 对于图 的任意一个连通分量,从任意一点开始 dfs,来求出任意一棵生成树,如果遇到非树边,判断深度的奇偶性是否相同,若相同,那么出现了奇环, 不是二分图;若所有非树边两端点深度奇偶性都相同,则根据深度奇偶性划分可得到一个二染色。
- 综上,可在时间复杂度 内解决问题。
给定无向图 ,每个点有 或 的一个标记,有 组询问,每组询问给定 ,你需要求出是否存在一条 的路径 ,使得路径经过的点的标记拼成一个回文。 可以不是简单路径。
.
暴力的想法是考虑 为 是否能走到 ,然后用类似 bfs 的方法更新 ,每次从队列中取出一个 ,往两边扩展,如果能更新新的 就扔进队列里面。这样复杂度是 .想办法优化这个暴力,也就是减少无用的边数。
如果要经过 从点 走到点 ,考虑可以在这条边上来回折返,那么我们只关心这两个点组成的 串出现次数的奇偶性。
考虑仅有两端点为 或者 的边及其端点组成的连通块,假设为 :如果要经过这个连通块,由于只关心路径上 出现次数的奇偶性,所以要保留的信息仅为任意两点之间路径经过边数奇偶性的可能性。
考虑到如果连通块中有奇环,那么在这个奇环中走一圈会到起点,即可改变路径奇偶性,则任意两点经过的边数奇偶都可以;如果没有奇环,说明是个二分图,那么两点如果在同一部点中,则经过边数一定是偶数,否则经过边数一定是奇数。
由于我们只关心经过路径奇偶性,所以如果该连通分量是二分图,那么直接保留一个尽量小的连通子图,保留一棵生成树即可,如果该连通分量不是二分图,保留一棵生成树然后加一个非树边组成一个奇环即可,例如一个自环。可以发现这样边数降到了 ,任意两点之间路径经过边数奇偶性的可能性不变。
这样子建图之后做那个 bfs 就可以 解决这个问题。
二分图最大匹配
二分图最大匹配问题,即对于给定的二分图 ,求出大小最大的边集 使得 中不存在两条共端点的边。
匈牙利算法
令 是一个匹配,其中的边称为匹配边,匹配边的端点称为匹配点,如果一条路径从一个未匹配的左部点出发到达一个未匹配的右部点,交替经过不在 中的边和在 中的边,则称该路径为一条增广路。
定理:匹配 是二分图的最大匹配,当且仅当图中不存在增广路。
必要性:将这条增广路上的所有匹配边改为非匹配边,所有非匹配边改为匹配边,则匹配数量增加。
充要性:反证法。对于匹配 满足图中不存在增广路。假设图中最大匹配为 ,则求出 和 边导出子图的对称差 .由于 和 都是匹配,则 中点的度数均不超过 ,则 为若干个环和若干条链构成,如果 小于 ,说明 中属于 的边要更多,由于环和偶链属于两者的边数相等,那么就说明一定存在奇链,即为一条增广路,与假设不符。
由充要性的证明,引出匈牙利算法:
枚举左部点 ,维护 与右部点的匹配,尝试对 进行匹配,进入以下过程:
- 假设尝试对左部点 进行匹配,枚举出边到达的点 :
- 若 没有被匹配,则找到一个增广路 ;
- 否则尝试对 匹配的左部点 进行匹配,若匹配成功则找到一个增广路 .若找到增广路,则将增广路上的边选择状态取反,答案 .
- 优化:每次从 寻找增广路时,如果一个左部点 或者右部点 之前被检查过没有找到增广路,则不必再检查一遍。
- 对于每个左部点,检查是 的,故算法的时间复杂度为 .
匈牙利算法基于一个贪心的原则:一个点一旦进入匹配,就不会重新成为非匹配点,因此当找不到增广路时表示 在保持 的匹配情况不变时一定无法加入最大匹配中。
基于此,我们可以得知,若将匹配成功的左部点视为 ,没有匹配的视为 ,则按照枚举顺序来拼接这些左部点,得到的字典序是最大的。
最大流做法
建立源点 和 汇点 , 向每个左部点连 ,每个右部点向 连 ,二分图上的边都是左部点向右部点连 ,求出最大流即为最大匹配。
用 Dinic 实现复杂度为 .
容易把问题转化为给定左部点度数均为 的二分图,求左部点对应匹配点字典序最小的完美匹配。
先考虑把能确定的都确定下,也就是考虑度数为一的右部点,将其与对应的左部点匹配,然后删掉。如果出现零度点则无解。
这样子剩余的左部点和右部点个数相等,并且右部点的度数都 (出现度数为 无解,出现度数为 的会被删掉),由于左部点度数都等于 ,说明右部点的度数也都等于 .
所以此时图是若干个环组成的,对于每个环来说,只有两个完美匹配,选取字典序较小的那一个即可。
时间复杂度易做到线性。
覆盖与独立集
二分图最小点覆盖
最小点覆盖:在图中选择尽量少的点使得每条边至少有一条边被选。
König定理:二分图最小点覆盖大小等于最大匹配大小。
这里给出一种最小点覆盖的构造方法:
- 对于每个右边每个失配点,尝试走增广路,即“一条匹配,一条没匹配...这样交替出现的路径”,将所有走到的点都打上标记,称之为标记点。
- 左侧的标记点和右侧的未标记点组成了最小点覆盖。
- 证明其是一个点覆盖:如果一条边左右端点都不在点覆盖集里面,则左端点是未标记点,右端点是标记点:如果这条边是匹配边的话,右端点想要被标记必须由左端点标记之后走匹配边标记到右端点,所以对于匹配边来说,要不然两端点都被标记,要不然都不被标记;如果这条边不是匹配边的话,右端点被标记之后会走未匹配边标记左端点。所以不会存在这种情况,其为一个点覆盖。
- 最小点覆盖的点的个数下界为最大匹配数,因为想要覆盖匹配边就需要最大匹配数个点,还有未匹配边要覆盖,所以点集大小不会比最大匹配数更小。
- 证明这样得到的点集大小是最大匹配数个:
- 对于匹配边,要不然两端点都被标记,要不然都不被标记,这样每一个匹配边都会唯一对应一个覆盖点,匹配边上的覆盖点也都会唯一对应上这条匹配边。
- 对于非匹配边来说,如果其右端点是标记点,使得左右端点都打上了标记,那么左端点是覆盖点也一定是匹配点,要不然就找到了一条增广路;如果其右端点不是标记点,其一定为覆盖点,也一定是匹配点,因为如果不是匹配点就会作为路径起点而被标记。这样就说明覆盖点和匹配边构成了一组双射,覆盖点的个数即为匹配边的个数。
感觉我的说明还是比较细致(麻烦),ix35说的就比较简略,但其实细节上自己推推都能推出来。
二分图最大独立集
最大独立集:在图中选出尽量多的点使得其导出子图不含边。
对于任意一张无向图,有如下定理成立:
定理:最大独立集大小与最小点覆盖大小之和等于点数。
任何一组独立集选择状态取反之后都为一组点覆盖(对于一条边,独立集是两端点至多选一个,点覆盖值两端点至少选一个),所以独立集和点覆盖是一一对应的。
二分图是特殊的无向图,所以其在二分图中也是成立的。
应用的话大概就是在一些求最大/最小个数的题目中,通过建模转化成二分图最大独立集/最小点覆盖的问题。比较常见的就是棋盘黑白染色模型。
经典栗题:洛谷 P3355 骑士共存问题,洛谷 P5030 长脖子鹿放置,前者是直接的棋盘黑白染色模型,后者则是需要略微观察找出二分图的棋盘模型。
二分图最小边覆盖
最小边覆盖:用最少的边覆盖所有的点。
定理:最小边覆盖大小等于最大独立集大小
考虑最小边覆盖的下界:由于最大独立集两两之间没有边相连,所以一条边至多能覆盖掉最大独立集中的一个点,所以最小边覆盖大小 最大独立集大小。
构造得到这个下界:先选出所有的匹配边,对于所有的未匹配点,选出任意一条与之相连的边,这样一共选了总点数减去最大匹配数条边,即为最大独立集大小。
有向无环图最小路径覆盖
给定简单 DAG,我们要选出其中数目最小的(经过的点)不相交的路径,使得每个点至少在一条路径上。
对于 DAG ,构造二分图 ,其中 左右各 个点,如果 ,则将 左侧编号为 的点和右侧编号为 的点相连。
定理:DAG 的最小路径覆盖大小等于 减去 的最大匹配数。
现在构造对 的路径覆盖和 的匹配构造一个双射:
- 对于 的一个路径覆盖,考虑一条路径 ,则在 中将左侧的 和右侧的 匹配。由于路径两两不相交,所以每个点的入度和出度 ,所以选出来的是一个匹配。
- 对于 的一组匹配,用类似的方法得到 的一个路径覆盖:初始时每个点都没有边经过,视为一条空的路径经过,对于每一个匹配边,在 中将其左侧点作为终点的路径拼接上其右侧点作为起点的路径。这样不会出现冲突,因为由于其为一个匹配,所以如果一个点被作为起(终)点拼接,它不会给另外一个点作为起(终)点拼接。
观察将 的匹配映射到 的路径覆盖的过程中,每一个匹配边都会使得 中的两条路径合并,那么 的最大匹配得到的就是 的最小路径覆盖。合并了 次,那么 中路径覆盖大小就是 ,定理得证。
栗题:[CTSC 2008] 祭祀
给定简单有向无环图 ,求最大的 使得 ,不存在 到 的路径。
将 DAG 传递闭包后得到一个偏序集,即如果 可以到达 则 .根据 Dilworth 定理,最长反链长度(两两不可比的最大集合)等于最小链划分大小(划分成尽量少的两两可比的集合),所以答案即为传递闭包后的最小路径覆盖大小。
二分图最大权匹配
费用流做法
建立源点 和 汇点 , 向每个左部点连流量为 ,费用为 ,每个右部点向 连流量为 ,费用为 ,二分图上的边都是左部点向右部点连流量为 ,费用为权值,求出最大费用最大流即为最大权匹配。
Hall 定理
对于二分图 ,令 表示与点 相邻的点集,则关于最大匹配,我们有如下结论:
Hall 定理:设二分图 的两部分别为 且 ,则其存在一个大小为 的匹配(存在完美匹配)当且仅当 ,有 .
必要性(显然): 中连出去的边数不足需要的边数,也就是,那么一定不会存在完美匹配。
充分性:假设最大匹配不是完美匹配,那么左部点集合 中至少有一个未匹配点 ,从这个 开始尝试走增广路,维护左部点集合 和右部点集合 :
- 每次走到一个新的 ,加进 中,由于满足 Hall 定理条件, 一定有一个相邻的点 ,满足其不在 中。如果其为未匹配点,则找到增广路,和最大匹配的假设矛盾;否则,将 加进 中,对于 的匹配点 递归判断。
每次都会加进去一个新的点,而总的点数是有限的,所以最终一定会推得矛盾,充分性得证,则 Hall 定理得证。
Hall 定理的简单推论:
推论:若一个无向图每个点度数都为 ,则称其为 正则图,那么左右点数相等的 正则二分图必有完美匹配().
证明:则考虑任意一个左部点集 ,若不满足 Hall 定理,其所有的点的邻居组成的集合 满足 , 和 之间的边共有 条,所以 的度数和 ;又由于 ,则 ,推得矛盾。所以这张图满足 Hall 定理,有完美匹配。
Hall 定理推广:设二分图 的两部分别为 ,则其最大匹配为 .
证明和 Hall 定理类似:
设 .
必要性:对于任意一个 ,其至少有 个点不能匹配,则整张图至少有 个点不能匹配。设其为 .
充分性:假设最大匹配 也就是最大匹配中有 个左部点是非匹配点,对于其中任意的 个非匹配点构成的集合 ,尝试从这些点开始走增广路,维护左部点集合 和右部点集合 ,不断递归进行以下操作:
- 由于 ,所以至少存在一个右部点 满足其不在 中。若 是非匹配点,则找到一个增广路,与最大匹配的假设矛盾;否则将 加进 ,对于和 匹配的点 ,加进 ,递归判断。
每次都会加进一个新的点,而点数是有限的,所以最终会推出矛盾。充分性得证,则结论得证。
网络流
网络
对于一个有向图 ,每条边 都有一个权值 ,称之为容量,当 的时候 ,有两个特殊的点,称之为源点 ,和汇点 ,其中 .
流
设 定义在二元组 上的实数函数满足:
- 容量限制:;
- 斜对称性:;
- 流守恒性:.
称 为网络 的流函数,整个网络的流量即为从源点出发的所有流量之和。
最大流 费用流 最小割
具体的做法众所周知,于是就不写了!
记一下复杂度:
求解最大流复杂度
Dinic 最坏复杂度为 ,事实上远远达不到这个上界。
对于求解类似二分图匹配问题时,所有边的流量均为 ,且除了源点和汇点外的所有点,都满足入边最多只有一条,或出边最多只有一条,这样的网络称之为单位网络,对于单位网络 Dinic 复杂度为 .
求解费用流复杂度
SSP 算法:最坏 复杂度,其中 是最大流。
定理:最小割等于将每条边的代价转换成其容量后 至 的最大流。
首先先将 无法到达的点和无法到达 的点删去,不影响最大流和最小割的值。
对于一组割,将 分成两个不相交子集 ,其中 为 能流到的点集, 为能流到 的点集, 一定是一组割,而且任意割一定能找到一个子集可以表示为这种形式。所以最小割一定可以表示成这种形式。
由于任意流都需要从 到 ,必须经过这些边,所以任意流 任意割。
对于最大流,将残量网络上的点分成 能到达的点集 ,以及 的补集 。则 一定都是满流的,其构成一组割,此时最大流 这组割。又由于任意流 任意割,所以这组割是最小割。
最小割的方案
在做完最大流之后求出残量网络中 可以到达的点集 ,其余的点构成的集合为 ,则所有 满足 ,则所有的 构成了一组最小割。
但是最小割可能存在很多种,我们定义一条边为可行边为存在一组最小割使得这条边被割断,必经边定义为在每组最小割中这条边都被割断。
考虑暴力判断每一条边:
- 若删掉 这条边,最小割的大小减少 ,则这条边是可行边;
- 若将 这条边权值改为 ,最小割变大,则这条边是必经边。
考虑更快地判断,在 跑完最大流的残量网络 上讨论:
命题:一条边 是最小割可行边,当且仅当这条边满流,并且 上不存在 的路径。
- 若不满流,退掉的流 ,再加上有可能还会有增广路,那么最小割大小减少的量一定 ;
- 若满流且 存在 的路径,那么将这条边删掉之后还会有增广路,最小割大小减小的量 ;
- 同理,若满流且 不存在 的路径,将这条边删掉之后没有增广路,最小割大小减小的量 ,其为可行边。
命题:一条边 是最小割必经边,当且仅当 上存在 和 的路径。
其实网上找到的命题还要满足满流,我想了一下如果 上存在 和 的路径,那么这条边一定满流,否则就出现了一条增广路。
注意到若满足此条件,将 这条边权值改为 ,产生增广路,最小割变大,则这条边是必经边。
定理:将 进行缩点,则边 是可行边当且仅当满流且 在不同 SCC,是必经边当且仅当满流且 在同一 SCC,且 在同一 SCC。
这里的 是指将残量网络中没有满流的边视作有向边,也就是删掉已经满流的边。
证明的话利用反向边讨论即可:
- 若 满流,那么其反向边 存在于 中,则存在 到 的路径等价于 在同一 SCC。所以边 是可行边当且仅当满流且 在不同 SCC;
- 若 满流,说明一定存在 的流,其路径上的反向边在其中,所以 存在 的路径,那么 存在 的路径等价于 和 在同一 SCC 中。同理, 存在 的路径等价于 和 在同一 SCC 中。
综上,定理得证。
根据以上定理,可以得到以下判断最小割方案的方式:
求出最大流,在残量网络上进行缩点,连接不同 SCC 的满流边是可行边,连接 所在 SCC 和 所在 SCC 的满流边是必经边。
也就是 [AHOI2009]最小割。
二分图最大匹配方案与可行边(点)必经边(点)
感觉没什么用,就不记了。遇到再来补。
最小割求最大权闭合子图
定义:有一个有向图,每一个点都有一个权值(可以为正或负或 ),选择一个权值和最大的子图,使得每个点的后继都在子图里面,这个子图就叫最大权闭合子图。
转化成最小割问题:
建立超级源点 和汇点 .
向每个正权点连边,流量为权值的绝对值。这条边存在代表该点在所选子图中。
每个负权点向 连边,流量为权值的绝对值。这条边存在代表该点不在所选子图中。
原图边的流量均为 (不能被割掉)。
求该网络的最小割,即可求出最大权闭合子图包含哪些点。
最大权闭合子图的权值 正权和 最小割。
合法性
当 和 连通时,选出的子图不满足条件。假设有一条增广路,,则 被选中, 没有被选中,不符合限制。
当 和 不连通时,选出的子图满足条件。对于任意一个 :
-
的后继负节点到 的边被割掉了,它们被选中了;
-
由于已经割掉了 的所有后继负节点, 的后继正节点一定无法走到 ,割掉它们与 的边是不优的,最小割不会把它们割掉,所以 的所有后继正节点都被选中了。
最优性
根据前面的讨论,任意一个合法的割都对应着唯一一个选点方案;任意一个合法的选点方案都对应着唯一一个割。
这样任意一个割和选点方案都组成了一个双射。由于一个选点方案的权值 正权和 割的大小。
所以最大权闭合子图的权值 正权和 最小割。
上下界网络流
上下界顾名思义就是对于每条边流过的流量,不仅有上界 ,还存在下界 (至少要流过多少流量)。也就是流函数 要满足 .
可以有以下分类:
- 无源汇和有源汇:因为有上下界,所以网络可以保持流量平衡而没有源点和汇点,这一类成为无源汇上下界网络流。
- 可行流,最大流,最小流,费用流。
无源汇上下界可行流
给定一张上下界网络图,求一种合法的流量函数,使得每个点都满足流量守恒。
考虑将其转化成无下界即普通的最大流问题。
对于每一条边,假装其流了 ,那么剩余能流的就是 ,但是这样流量不一定守恒,于是考虑每个点 出流量与入流量的差 ,并建立超级源点 和 :若 ,则出入流量已经守恒;若 ,出流量太多了,需要一定的入流量来平衡,于是连边 ;若 ,入流量太多了,需要一定的出流量来平衡,于是连边 .
这样求出 到 的最大流,如果新加的边是满流,就说明这个点可以保持流量平衡,否则就不能保持流量平衡。若所有点都保持流量平衡即求出一个可行流,否则不存在可行流。
有源汇上下界可行流
添加一条边 即可转化成无源汇上下界可行流。
有源汇上下界最大流
看看有没有可行流,如果有的话删掉所有附加边在残量网络上再跑一次最大流(这次只有上界了),将可行流和最大流相加即为答案。
不会证明正确性,也没找到。
也可以二分答案,将 的边下界设为 转成可行流问题。
有源汇上下界最小流
类似最大流,考虑将残量网络中不需要的流退掉,在残量网络上跑一次 到 的最大流,将可行流减去最大流即为答案。
不会证明正确性,也没找到。同理也可以二分答案。
有(无)上下界最小(大)费用可行(最大)流
和上面的都一样,把最大流换成费用流。
有负环的费用流
对于价值为负数的边 ,先假装这条边流满了,答案费用加上 ,然后建反边 ,这样就都是正权边了。
但是流量可能不平衡,那就用上下界网络流的思想建立超级源点 和超级汇点 ,和多流出或者多流入的点连边即可。
如果原问题是有源汇无源汇,流量有无下界,进一步的解决方法和之前讨论到的都是一样的。
终于把基础的东西都写完了,待补的还有二分图最大权匹配的KM算法,这个感觉还用不到,也有可能是没什么用,等以后再学吧。
【推荐】国内首个AI IDE,深度理解中文开发场景,立即下载体验Trae
【推荐】编程新体验,更懂你的AI,立即体验豆包MarsCode编程助手
【推荐】抖音旗下AI助手豆包,你的智能百科全书,全免费不限次数
【推荐】轻量又高性能的 SSH 工具 IShell:AI 加持,快人一步
· .NET Core 中如何实现缓存的预热?
· 从 HTTP 原因短语缺失研究 HTTP/2 和 HTTP/3 的设计差异
· AI与.NET技术实操系列:向量存储与相似性搜索在 .NET 中的实现
· 基于Microsoft.Extensions.AI核心库实现RAG应用
· Linux系列:如何用heaptrack跟踪.NET程序的非托管内存泄露
· TypeScript + Deepseek 打造卜卦网站:技术与玄学的结合
· Manus的开源复刻OpenManus初探
· 三行代码完成国际化适配,妙~啊~
· .NET Core 中如何实现缓存的预热?
· 阿里巴巴 QwQ-32B真的超越了 DeepSeek R-1吗?