有正能量的二分图

二分图匹配

严格按照,nodgd 做梦梦到的单子,进行记录。

算法

交错路:匹配边和未匹配边交替的路径。

增广路:起点和终点都是未匹配点的交错路。

匈牙利算法

思想是从每个点增广一次。

怎么优化?random_shuffle,预选边,bitset + bfs 可以做到 \(O(\frac{n^3}{\omega})\)

HK

这不就是最大流吗?dinic 就做完了。

KM

你谁。

经典问题

  • 最小点覆盖,等于最大匹配(以下用 \(P\))表示,证明+构造:https://oi-wiki.org/graph/graph-matching/bigraph-match/#二分图最小点覆盖。或者用最大流最小割证明。

  • 最大独立集,等于点数(以下用 \(N\) 表示)减去 \(P\),考虑用最小点覆盖解释,因为最小点覆盖每条边至少被一个点覆盖,那么它的补集每条边至多被一个点覆盖。

  • 最大团,如果满足补图是二分图,那么就是补图的最大独立集。

  • 最小边覆盖。感性理解是选出一个最大的不相邻的边的集合,然后再补上没有选到的点。即 \(P+N-2P=N-P\)

  • DAG 最小路径覆盖,等于 \(N-P\)。将每个点拆成入点和出点 \(u_1,u_2\),如果有边 \((u,v)\) 则将 \(u_2\) 连向 \(v_1\)。每次匹配一条边相当于合并两条路径。

  • DAG 最小可重路径覆盖,等于 floyd 传递闭包后 \(N-P\)

  • 有向图是否存在 \(n\) 个点的简单环等价于是否存在完美匹配。

  • 最大广义独立集(DAG,选出的点任意两点不可达)等于 DAG 最小链覆盖。(Dilworth 定理,偏序集(DAG)的最小链覆盖等于最长反链)。

    链是互相有偏序关系的点集,反链是互相没有偏序关系的点集。所以最小链覆盖事实上是最小可重路径覆盖。

    注意到最大广义独立集还可以用最大权闭合子图建模。即每个点拆成 1(出点)和 -1(入点),然后自己的 -1 先连向 1。一条边 \((u,v)\) 就将 \(u\) 的出点连向 \(v\) 的入点。显然跟原问题等价。

  • 二分图博弈,二分图(或无向图)上有一枚棋子 \(u\),两人轮流操作将棋子移动到相邻且没去过的点,无法行动则失败。先手必胜当且仅当 \(u\) 在所有最大匹配中都出现过,即关键点。不妨设当前图为 \(G\),最大匹配为 \(M\)

    如果 \(u\) 是最大匹配关键点,那么先手只需选择一条匹配边 \((u,v)\) 到达 \(v\)。那么得到新图 \(G'=G\setminus u\) 的最大匹配为 \(|M|-1\),并且 \(M\setminus (u,v)\)\(G'\) 的一个最大匹配,所以 \(v\) 不是 \(G'\) 的最大匹配关键点。

    反之,如果 \(u\) 不是关键点,对于不包含 \(u\) 的最大匹配 \(M\)(一定是新图的最大匹配,并且新图的最大匹配一定也是它),那么对于 \(\forall v\in N_G(u)\)\(v\) 一定在 \(M\) 中。否则将 \((u,v)\) 加入 \(M\) 更优。所以任选 \(v\) 都是新图的关键点。

  • 稳定婚姻问题。https://oi-wiki.org/graph/graph-matching/stable-match/#稳定婚姻问题

相关证明

证明:一个最大匹配为 \(M\) 的二分图,一定至少包含 \(M\) 个最大匹配关键点。

对于一个大小为 \(M\) 的最小点覆盖 \(S\),假设其中点 \(u\) 不是最大匹配关键点。首先因为 \(S\) 是最小点覆盖,所以能覆盖任意最大匹配的 \(M\) 条边,而在不包含 \(u\) 的最大匹配 \(A\) 中,\(u\) 没有连接匹配边,所以覆盖 \(0\) 条匹配边,也就说明剩下 \(M-1\) 个点要覆盖 \(A\)\(M\) 条边,这显然不可能。

所以任意一个最小点覆盖里的点都是最大匹配关键点


证明 \(\mathbf{dilworth}\) 定理。

对于一个偏序集 \(P\),记其大小为 \(n\),通过偏序关系建出二分图 \((U,V,E)\),记 \(C\) 为其最小点覆盖。令 \(A=\{x\in P\mid u_x\not\in C且v_x\not\in C\}\)。首先证明 \(A\) 是反链,如果 \(x,y\in A\) 满足 \(x,y\) 有偏序关系,那么就有边 \((v_x,u_y)\),又因为 \(v_x,u_y\not\in C\),所以与点覆盖矛盾。

同时若 \(x\in A\),那么 \(u_x\in C\)\(v_x\in C\),因此这样的 \(x\) 的数量至少为 \(\dfrac{|C|}{2}\),至多为 \(|C|\),即 \(|A|\ge n-|C|=n-|M|\)。设 \(\alpha\) 为最长反链的大小,那么 \(\alpha\ge |A|\ge n-|M|\)

同时该图的最小链覆盖数量 \(\beta\) 根据结论是等于 \(n-|M|\)。所以 \(\alpha\ge \beta\)。又因为在任何链划分当中每条链至多包含一个反链中的点,所以 \(\beta\ge \alpha\)所以可以得出结论 \(\alpha=\beta\)。并且 \(A\) 就是一个最长反链。

一般图匹配(Tutte 矩阵)

为什么要放在二分图匹配里?

完美匹配

考虑设计矩阵 \(G\)

对于 \(i\le j\),如果 \(i\)\(j\) 有边,那么 \(G_{i,j}=x_{i,j}\)\(G_{j,i}=-x_{i,j}\)。否则 \(G_{i,j}=G_{j,i}=0\)

结论:\(\det(G)\ne 0\) 等价于图存在完美匹配。

证明可以考虑 \(\det(G)\) 的定义

\[\det(G)=\sum_{P}(-1)^{\pi(P)}\prod_{i=1}^{n}G_{i,p_i} \]

如果该式存在贡献,那么对于 \(\forall i\)\(i\)\(p_i\) 必然有边,产生贡献的边形成了若干个环。

注意到如果这些环中有奇环,那么把环翻转后 \(G\) 的乘积恰好取反,而逆序对不变。因此奇环的两种情况抵消。

所以只需要考虑只有偶环的情况。此时每个偶环内的点必然存在匹配。而如果存在匹配,那么这些点两两成环必然合法。证毕。

最大匹配

考虑怎么求最大匹配,大胆猜测:答案是 \(\frac{\text{rank}(G)}{2}\)。回忆一下,矩阵的秩是什么?

矩阵的秩,指的是矩阵中线性无关的行(或列)的最大数目

也即将 \(A\) 化为行阶梯形后(高斯消元)非零行的个数,或者说非零子式(任选 \(k\)\(k\) 列构成行列式)的最高阶数。

\(M\) 为其最大匹配,

  • 证明 \(\text{rank}(G)\ge 2|M|\)。假设 \(M\) 覆盖的顶点集合为 \(S\)\(|S|=2|M|\)。将顶点重新排序,使得 \(S\) 中的顶点对应前 \(2|M|\) 行和前 \(2|M|\) 列,考虑 \(G\) 的由 \(S\) 诱导的主子矩阵 \(G[S]\),它是一个 \(2|M|\times 2|M|\) 的斜对称矩阵。

    因为 \(M\)\(S\) 的一个完美匹配,所以根据上面的结论有 \(\det(G[S])\ne0\),所以 \(G[S]\) 满秩,\(\text{rank}(G)\ge \text{rank}(G[S])=2|M|\)

  • 证明 \(\text{rank}(G)\le 2|M|\)。设 \(r=\text{rank}(G)\),因为 \(G\) 是斜对称矩阵,所以 \(r\) 是偶数。根据秩的定义,\(G\) 存在一个 \(r\) 阶主子矩阵 \(T\) 满足 \(\det(T)\ne 0\)。设 \(S\) 为其对应的顶点集合,那么 \(T\) 事实上就是子图 \(G[S]\) 的 Tutte 矩阵,因为 \(\det(T)\ne 0\),所以 \(G[S]\) 存在完美匹配,也是原图的一个匹配,并且匹配数为 \(\frac{r}{2}\)。所以得到 \(|M|\ge \frac{r}{2}\)\(2|M|\ge r\)

最小(大)权完美匹配

更改一下 \(G\) 的定义,在每个 \(G_{i,j}\) 后面乘一个 \(y^{w_{i,j}}\),然后 \(\det(G)\) 求出来就是一个关于 \(y\) 的多项式。以最小权完美匹配为例,结论:最小权完美匹配的权值等于 \(\det(G)\) 的系数非零项里 \(y\) 的最低次数除以 \(2\)

假设其最小权完美匹配是 \(M=\{(u_1,v_1),(u_2,v_2),\cdots\}\),权值是 \(k\)。那么在算行列式时排列 \(p_{u_i}=v_i,p_{v_{i}}=u_i\) 一定会对 \(y^k\) 产生贡献,所以 \(y^k\) 系数是非零的。所以只需要证明次数 \(<k\) 的系数全零即可。考虑反证,假设排列 \(\sigma\) 对小于 \(y^r(r<k)\) 产生贡献,即 \(\sigma\) 是若干偶环。考虑将环长 \(\ge 4\) 的偶环拆成若干二元环。假设这个偶环上点集 \(\{s_1,s_2,\cdots,s_{2l}\}\),那么要么将其拆为 \(\{\{s_1,s_2\},\{s_3,s_4\},\cdots,\{s_{2l-1},s_{2l}\}\}\),要么就是 \(\{\{s_2,s_3\},\{s_4,s_5\},\cdots,\{s_{2l},s_{1}\}\}\),然后拆成权值和最小。注意到

\[2\min(w_{s_1,s_2}+w_{s_3,s_4}+\cdots,w_{s_2,s_3}+w_{s_4,s_5}+\cdots)\le w_{s_1,s_2}+w_{s_2,s_3}+\cdots \]

所以这样拆之后权值和不会 \(>r\)。然后不断操作,最后一定拆成若干二元环且权值和 \(\le r\),又因为这若干二元环肯定是一个完美匹配,所以就与 \(k\) 是最小权完美匹配矛盾。

题目

A

比较套路,但是没见过不太想得出来。区间排序问题考虑先任取两个区间出来讨论。 假设选的是 \([l_1,r_1)\)\([l_2,r_2)\),不妨假设 \(l_1<l_2\),有三种情况

  • \(l_2>r_1\),即不交,那么这两个区间的先后顺序不会影响端点处的贡献。
  • \(r_2>r_1\),即包含,那么第一个区间先操作一定是更优的。
  • 否则存在交叉,先选第一个区间 \(l_2\) 就会贡献答案,先选第二个区间 \(r_1\) 就会贡献答案,是一个二选一问题。

所以根据这个形式,考虑图论建模,因为 \(l,r\) 互不相同所以最后一定是一张二分图。然后就变成求最大独立集问题,用 bitset + bfs 优化即可。

H

因为去掉边权后 B 必胜,所以假设有边权后还是 B 必胜。考虑 B 必胜的策略。不妨假设 A 选了“递增”,否则把边权取反。

我们希望找到一组匹配,使得对于任意两条边 \((a,b),(c,d)\),如果 B 选择走 \((a,b)\),然后 A 选择走 \((b,c)\) 然后 B 可以继续走 \((c,d)\)。即需要满足 \(w(a,b)<w(b,c)\)\(w(c,d)<w(b,c)\)。也就是不能存在 \(w(a,b)<w(b,c)<w(c,d)\)。转一下,即变成若 \(w(b,a)<w(b,c)\),则不能 \(w(c,b)<w(c,d)\)

对于 \(a,c\) 这侧点,考虑让其按边权升序排序,\(b\) 这侧点让其按边权降序排序。然后这等价于如果对于 \(b\) 来说 \(c\)\(a\) 更优,那么对于 \(c\) 来说 \(b\) 不能比 \(d\) 更优。这其实就是一个稳定婚姻问题。

J

不妨考虑建出 \(n\) 个行点和 \(m\) 个列点的二分图,如果 \((i,j)\) 不确定,就在 \(i\)\(j\) 之间连一条边。于是就分成了若干连通块,连通块之间肯定是互相独立的,所以只需考虑一个连通块的方案。

然后问题等价于给每条边染 \(0\)\(1\) 使得每个点的邻边的异或和等于 \(c_i\),其中 \(c_i\) 由已经填的数确定。我们不妨先考虑树怎么染色,比较显然可以剥叶子,最后只需要检查根节点是否合法即可。容易证明其合法条件的充要条件为 \(\bigoplus c_i=0\),考虑最终每条边会被贡献 \(2\) 次,所以贡献全局异或和为 \(0\)

而对于一个连通块,先随意求出一个生成树,然后再加入非树边,非树边是可以随意赋权的,因为可以把它看作确定边然后更新 \(c_i\),因为一次更新两个,所以不会影响 \(\bigoplus c_i\)。所以一个连通块的方案是 \(2^{m-n+1}\)\(n\)\(m\) 分别是这个连通块的点数和边数。

乘起来,那么总答案要么是 \(0\),要么是 \(2^{nm-n-m-k+c}\),其中 \(c\) 是连通块个数。所以只需要用并查集维护一下连通块和异或和即可。注意到边数可能有 \(O(nm)\) 条,但是对于一个行点去考虑,连出去若干区间,区间总数是 \(O(k)\) 的,直接差分一下即可。

posted @ 2026-01-10 15:31  _chara  阅读(3)  评论(0)    收藏  举报
Title