学习ix35笔记1

P5292 [HNOI2019]校园旅行

很牛的!

考虑一个裸 m 2 m^2 m2dp

我们设 f i , j f_{i,j} fi,j表示一个点到点i一个点到点j情况下的最优答案是什么

转移只要枚举点i的一条出边和点j的一条出边,然后对应的走过去就好了

这样裸做的复杂度 O ( m 2 ) O(m^2) O(m2)不太行QAQ

我们观察dp似乎没有任何可以优化的地方,观察转移,看上去也不好对于某一些相同颜色的转移同时加上一个数之类的变成1啊

但是我们隐隐约约可以感受到图中的信息大部分是没有用处的,因为我们可以在某两个点上反复横跳以达到奇偶性不变却匹配序列延长的结果

那我们转而对于奇偶性考虑,改变状态是不现实的,考虑转移

对于某一些相同标记的点,他们之间可能会反复横跳,但是会发现奇偶性不一定不会改变啊Qaq!

我们可以考虑如下事实,任意一张二分图在经过改图从x到y的路径长度奇偶性是确定的

因此对于同色边形成的二分图我们只需要保留一颗生成树就能够走过去了

而对于一个非二分图我们一定可以绕一个奇环,改变走回来点u时的奇偶性

所以考虑任意的非二分图我们只需要保留一个生成树再任意添加一个自环即可

你注意到我们没有管原图长什么样子哎?

是的,原图什么样子我们漠不关心,因为我们一定可以在某一条边上反复横跳达到想要的结果长度

于是对于不同色的边,我们也取一个生成树就好了

再使用一个BFS算法,每次把没有经过的点加入队列更新

复杂度 O ( ∣ V ∣ 2 + q ) O(|V|^2+q) O(V2+q)

匈牙利算法基于贪心原则:一旦一个点进入匹配,就不会重新成为非匹配点,因此当找不到增广路时表示 i i i 在保持 1 , … , i − 1 1,\ldots,i-1 1,,i1 的匹配情况不变时一定无法加入最大匹配中。

由此,我们可以知道:若将匹配的左部点记为 1,未匹配的左部点记为 0,则按照枚举顺序拼接左部点的匹配情况,匈牙利算法求出的最大匹配是字典序最大的。

P1963 [NOI2009] 变换序列

建立二分图之后,去除一度数点之后形成了若干个环,因此我们每个点只能有两种选择

从后向前跑匈牙利,发现每次我们尽可能用最小的未匹配边更新答案即可,这样我们最靠前的点最优,可能使用一个更优秀的边去替换掉剩下的那些点的决策

因为我们每个点有两种完美匹配因此是对的

如果是一般图,我们可以考虑调整法,先任意求出一个完美匹配,然后对于完美匹配不断寻找增广回路以改进当前解获得最优解

从前向后做,然后每次确定好一个点的编号,然后就固定住不再改变了

那么之后的找完美匹配边就相当于不能变之前的那些点信息,而下面的匹配可以随便改动,看能不能有一个比当前匹配更优秀的匹配法子

这样做复杂度是 O ( m 2 ) O(m^2) O(m2)而且优化不动…

定理:二分图最小点覆盖大小等于最大匹配大小。

随后,我们给出一种最小点覆盖的构造方法:

  • 在求完最大匹配后,从二分图的每个左部未匹配点出发进行一次寻找增广路,然后将途径的所有点设为已经过标记。
  • 取左侧所有未标记点和右部所有标记点,它们构成一组点覆盖。
  • 下面证明这是一组点覆盖:如果存在一条边两端都没有选,说明其左侧是标记点,右侧是非标记点,但是在那个左侧点被标记后,右侧的点随后就会被经过,所以这是不可能的。
  • 下面证明这组点覆盖的大小等于最大匹配大小:对于每条匹配边,或者左侧右侧同时被标记,或者同时没被标记,因此必定恰有一个点被选;而对于一条非匹配边,假设左侧点不是匹配点,那么必然被标记,假设右侧点不是匹配点,那么必然不被标记(否则找到了一条增广路),因此只有所有匹配边的恰好一边在这组点覆盖中。

实际上,我们还容易证明任何一组点覆盖大小 ≥ \ge 任何一组匹配大小,根据上面的构造,也可以得到定理。

定理:最大独立集大小与最小点覆盖大小之和等于点数。

定理:二分图最大独立集大小与最大匹配大小之和等于点数。


二分图最小边覆盖

最小边覆盖的定义类似最小点覆盖,即用最少的边覆盖所有的点。

如果不存在孤立点,则二分图最小边覆盖等于最大独立集大小,即总点数减去最大匹配大小。

首先,最大独立集中任何两个点一定不能由一条边覆盖,因此最小边覆盖不小于最大独立集。

再构造一种方案:选出所有匹配边,再对于所有未匹配点单独选一条和它相连的边,就得到了一组等于最大独立集的边覆盖,因此结论得证。

所有匹配边加上所有未匹配点的任意一条边

有向无环图最小路径覆盖

定理:G 的最小路径覆盖大小等于 ∣ V ∣ |V| V 减去 G 0 G_0 G0 的最大匹配大小。

最小的不相交的路径

设给定的有向图为 G = ( V , E ) G=(V,E) G=(V,E),构造二分图 G 0 G_0 G0,左右各 ∣ V ∣ |V| V 个点,如果 ( x , y ) ∈ E (x,y)\in E (x,y)E,则将左边的点 x x x 与右边的点 y y y 连边,有该定理

[CTSC 2008] 祭祀

Dilworth定理 :偏序集的最长反链等于最小可重链划分数

我们如果设A能到达B则 A ≥ B A\geq B AB,那么显然我们选择的就是最小的一些数形成最长反链

因此我们求出该DAG的最小路径覆盖就是最小链划分数,如果有答案为m,那么最小路径覆盖不可能小于 m m m

最小顶标和问题:给定二分图,给每个点一个顶标,使得每条边两端点的顶标和不小于边权,且所有点顶标和最小。

接下来我们将介绍 KM 算法,KM 算法通过解决最小顶标和问题,可以求出给定二分图的一组权值和最大的完美匹配

Hall 定理:设二分图 G G G 的两部分别为 X , Y X,Y X,Y ∣ X ∣ ≤ ∣ Y ∣ |X|\leq |Y| XY,则其存在一个大小为 ∣ X ∣ |X| X 的匹配当且仅当 ∀ S ⊆ X \forall S\subseteq X SX,有 ∣ S ∣ ≤ ∣ ⋃ v ∈ S N ( v ) |S|\leq |\bigcup\limits_{v\in S} N(v) SvSN(v)

即我们对于任意一个左边的点集对应右边的连边数量都要达到左边点集的大小qwq!

必要性证明:

我们如果存在S条件不成立那么S集合内所有点的匹配点形成了一个大小 ≥ ∣ S ∣ \geq |S| S的点集他们必须在所有N的并里面,子集的大小不可能超过超集的大小

充分性证明:

右侧点应该是左侧点的N集合的并集!

推论:若一个无向图每个点度数都为 k k k,则称其为 k k k 正则图,那么左右点数相等的 k k k 正则二分图必有完美匹配( k ≥ 1 k\ge 1 k1)。

Hall 定理推广:设二分图 G G G 的两部分别为 X , Y X,Y X,Y,则其最大匹配为 ∣ X ∣ − max ⁡ ( ∣ S ∣ − ∣ ⋃ v ∈ S N ( v ) ∣ ) |X|-\max(|S|-|\bigcup\limits_{v\in S} N(v)|) Xmax(SvSN(v)),其中 S ⊆ X S\subseteq X SX

给定左部 n n n 个点,右部 m m m 个点的二分图,左部点 i i i 向右部 [ l i , r i ] [l_i,r_i] [li,ri] 内所有点连边,求是否存在大小为 n n n 的匹配。

我的做法是线段树在右侧扫描然后相当于维护所有左端点这段区间中长度减去右半边交集这个东西的大小,如果有一个时刻大于0说明就不对了…

时间复杂度就是 O ( n + m log ⁡ n ) O(n+m\log n) O(n+mlogn)

一个更好的做法:我们左边每个元素按照 r i r_i ri排序,然后从小到大每个尽量选 l i l_i li,不行再一次向后看

如果排序可以很快就可以做到线性,序列线性并查集

这启发我们:Hall 定理可以作为一些显式或隐式匹配问题的贪心策略依据。

例题 9:

给定左部 n 个点,右部 m 个点的二分图,左部点 i 向右部 [ 1 , l i ] ∪ [ r i , m ] [1,l_i]\cup [r_i,m] [1,li][ri,m] 内所有点连边,求最大匹配。

这个好像也做过的?

相当于我们枚举左侧点集L,右侧邻居点集R必然是一段前缀拼上一段后缀

枚举KaTeX parse error: Undefined control sequence: \or at position 8: R=[1,l]\̲o̲r̲ ̲[r,n],同上题可以得到关于L中的点 l i , r i l_i,r_i li,ri,数据结构升序扫描l

对于每个r维护 ∣ L ∣ − ∣ R ∣ |L|-|R| LR,当l增加时遇到 l i = l l_i=l li=l对于 r ≤ r i r\leq r_i rri的r我们可以把他的 ∣ L ∣ − ∣ R ∣ |L|-|R| LR增大1


例题 10:

给定左部 n 个点,右部 m 个点的二分图,左部点有点权 a i , b i a_i,b_i ai,bi,右部点有点权 c j , d j c_j,d_j cj,dj,且 ( i , j ) (i,j) (i,j) 之间有边当且仅当 a i ≥ d j a_i\ge d_j aidj 或者 c j ≥ b i c_j\ge b_i cjbi,求最大匹配。

和上述做法一样,我们只需要按照 a , d , b , c a,d,b,c a,d,b,

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值