有正能量的络二网分图流
猫猫猫?
二分图的判定
根据二分图的定义,只需要在图中找奇环即可。
可以使用 \(\text{BFS}\) 或 \(\text{DFS}\) 进行二分图染色实现。带权并查集或者扩展域并查集也可以直接求解。
匈牙利算法
最暴力求解二分图最大匹配的算法。
核心思想是每次加入新点时,从该点出发,找到一条匹配边和未匹配边交替,且两端均为未匹配边的路径,然后把这条路径整体的匹配状态进行翻转,得到匹配数 \(+1\) 的效果,称为增广路。
单次加入一个点时最坏会将整个图遍历一遍,所以总复杂度为 \(O(nm)\)。
默写作业:
int link[maxn];
bool vis[maxn];
vector<int> e[maxn];
bool hung(int u){
for(int v:e[u]){
if(!vis[v]){
vis[v]=1;
if(!link[v]||hung(link[v])){
link[v]=u;
return 1;
}
}
}
return 0;
}
我错了,这个模板过不了编译,要把所有的 link 都换成 lk 才行,我再也不在代码里面写关键字了呜呜呜。
卡满上界的构造方法
如果不加以任何优化,完全二分图就可以把该算法卡到 \(O(n^3)\) 的复杂度,但大概还是带 \(\frac 1 8\) 的常数。
小优化
-
使用 \(\text{bitset}\) 和 \(\text{BFS}\) 就可以把复杂度降至 \(O(\frac {nm} w)\)。
-
选择非 \(0\) 度点数量较小的一侧作为最外层加入点的一侧。
-
清空
vis数组的时候可以采用时间戳优化。 -
在算法开始之前,随机打乱加入点的顺序和每个点的出边顺序。
最小点覆盖
首先由 \(\text{Kong}\) 定理可以得到二分图的最小点覆盖 \(=\) 最大匹配。下面进行证明,令二分图的最大匹配为 \(p\),最小点覆盖为 \(q\)。
要证 \(q=p\),分两步证明 \(q \geq p\) 和 \(q \leq p\) 即可。
- \(q \geq p\)
对于最大匹配中的每一条边,都需要一个对应的点进行覆盖,所以至少需要 \(p\) 个点。
- \(q \leq p\)
考虑构造一种恰好 \(p\) 个点的最小点覆盖方案,由最优性即可推出 \(q \leq p\)。
将最大匹配中所有匹配边的两个端点都染成蓝色,那么显然有任意的一条边都至少存在一个端点是蓝点,尝试选 \(p\) 个蓝点来覆盖所有边。
考虑从左部的每一个未盖点出发,进行找增广路的过程,并标记访问过的点。
最后左部所有的未标记点和右部所有的标记点即为所需要的点集。
因为右部的标记点一定是匹配点,否则就出现新的增广路了。
而且对于一条边上的两个匹配点,要么都被标记,要么都不被标记。所以上述选取的点集大小一定恰好为 \(p\)。
根据该定理和证明过程我们可以直接解决最小点覆盖的求解和输出方案,例题有 \(\text{UVA11419}\)。
最小边覆盖
选最少的边,使得每个点都有相邻的边被选择。
结论是最小边覆盖 \(=\) \(n_1+n_2-\) 最大匹配,其中 \(n_1\) 和 \(n_2\) 表示两部分的点数。
证明可以考虑对于一个边覆盖的方案,可以对每个点进行钦定被哪条边所覆盖,然后去掉那些不被任何一个点所钦定的边,令 \(p\) 为同时被两个点所钦定的边,就得到了答案集合大小为 \(n_1+n_2-p\) 的覆盖方案。
从这个式子出发,需要找到 \(p\) 的最大值,不难得出 \(p_{\max}\) 就是二分图最大匹配。
(稍微有点感性。)
证明:最小边覆盖 \(\geq\) 最大匹配
令最大匹配为 \(p\),即证明 \(n_1+n_2-p \geq p\)。
因为 \(p \leq \min(n_1,n_2)\),所以有 \(2p \leq 2 \min(n_1,n_2) \leq n_1+n_2\),当且仅当原二分图存在完美匹配时等号成立。
构造方案
先选定最大匹配中的边,然后对于每一个未盖点再任选一条相邻边即可。
边支配集
选最少的边,使得每一条未选边都存在一条已选边和它有公共顶点。
证明:最小边支配集 \(\leq\) 最大匹配
根据最大匹配的最优性,最大匹配中的边集显然是一个合法的边支配集,得证。。。
该问题在二分图上是 \(\text{NP-hard}\) 问题:

最大独立集
不难发现,任意独立集的补集一定是一个合法的点覆盖,所以有最大独立集 \(=\) \(n_1+n_2-\) 最小点覆盖。
\(\text{DAG}\) 最小不可重链覆盖
先钦定每个点为单独的一条链,然后选定 \(k\) 条边组成若干条不交的链,答案即为 \(n-k\)。
因为点不可重,所以仅保留选定的边,每个点的入度和出度都不超过 \(1\)。
考虑拆点,将点 \(i\) 拆成 \(i_1\) 和 \(i_2\) 分别表示出点和入点,对于原图中一条边 \((u,v)\),映射到新图中的 \((u_1,v_2)\)。
在新图中跑二分图最大匹配的结果即为最大的 \(k\)。
例题在这里,这道题还结合了一点 \(\text{DP}\)。
\(\text{DAG}\) 最小可重链覆盖
允许重复经过点可以看作是允许跨越一些点。
转化为在原 \(\text{DAG}\) 上跑传递闭包之后得到的新 \(\text{DAG}\) 上求解最小不可重链覆盖即可。
\(\text{UVG}\) 游戏
在无向图上有一枚棋子放在起点上,两人轮流操作将棋子移动到相邻且没有去过的点,无法行动则失败。
结论:若任意最大匹配方案的点集都包含起点,则先手必胜,否则先手必败。
把访问过的点看作被删除。
按照博弈论的流程,分两步来证明该结论。
- 任意的必胜态都能到达必败态。
考虑原图的一个最大匹配边集 \(M\),因为 \(u\) 是必胜点,所以一定存在 \((u,v) \in M\)。
删去点 \(u\) 之后,新图的最大匹配数会减小 \(1\),且 \(M \setminus \{(u,v)\}\) 是其中一种最大匹配方案,那么可知 \(v\) 在新图中是必败点。
- 任意的必败态都只能到达必胜态。
因为 \(u\) 不被所有最大匹配方案所包含,所以删去 \(u\) 之后的新图的最大匹配数不变,令这个值为 \(p\)。
对于任意与 \(u\) 相邻的点 \(v\),若 \(v\) 是必败点,则有一种新图的匹配方案 \(M\),满足 \(|M|=p\),且不存在 \(w\) 使得 \((v,w) \in M\)。
那么可以在原图中构造出一个匹配方案为 \(M \cup \{(u,v)\}\),其大小为 \(p+1\),与原图的最大匹配数为 \(p\) 相悖。
故 \(v\) 一定是必胜点,证完了喵喵喵。
必胜策略
若当前点是必胜点,走一条在任意匹配方案中是匹配边的边即可



。

浙公网安备 33010602011771号