首页 > 其他分享 >二分图

二分图

时间:2023-03-11 12:55:06浏览次数:40  
标签:二分 匹配 覆盖 最小链 等于 反链

最大匹配

最基本的东西,可以用 dinic 在 \(\mathcal{O}(m\sqrt n)\) 的时间内解决。

Hall 定理

判断二分图是否存在完美匹配的定理。

默认左部点数小于等于右部点数,定义 \(N(S)\) 为左部点中在 \(S\) 中的点相连的右部点的并集,如果 \(\forall S,|N(S)|\ge |S|\) 则二分图存在完美匹配。

最小点覆盖

最小点覆盖等于最大匹配。

首先最小点覆盖肯定大于等于最大匹配,因为匹配边的两点必然选一个。

然后我们可以构造一组等于最大匹配的最小点覆盖:

一开始匹配边长这样,假设我们一开始选择全部左边的匹配点,显然是不行的,考虑调整。

我们想让最上面那个非匹配边被覆盖,我们可以不选左边的匹配点了,改成选右边的匹配点就可以了。

所以我们证明了最小点覆盖等于最大匹配。

上面的构造方法也告诉了我们构造方案的做法,具体实现是:

  1. 找到左边的非匹配点开始非匹配边、匹配边交替走,一直走到没路走,标记已经经过的结点,注意不能经过已经标记过的节点。
  2. 最小点覆盖就是左边的未标记点加上右边的标记点。
void dfs(int now) {
	vis[now] = true;
	int SIZ = v[now].size();
	for(int i = 0; i < SIZ; i++) {
		int next = v[now][i].to;
		if(vis[next] || !v[now][i].val)//正向边的容量为0说明是匹配边,反向边的容量为0说明是非匹配边
			continue;
		dfs(next);
	}
}

最大独立集

对于一个点覆盖,一条边两端至少有一个点,对于它的补集,一条边最多有一个点,所以它的补集是一个独立集。

对于一个独立集,同理补集是一个点覆盖。

所以独立集与点覆盖一一对应,所以最大独立集等于点数减去最小点覆盖。

最小链覆盖

对于一个 \(n\) 个节点的 DAG,我们可以对应出一个 \(2n\) 个节点的二分图,一个原图的点 \(u\) 拆成 \(u_l,u_r\),原图的一条边 \((u,v)\) 变成 \(u_l\to v_r\)。

我们发现 \(n\) 减去这个二分图的最大匹配就是最小链覆盖,因为一开始我们把每一个点当成一条链,二分图上每匹配一次相当于把两条链首尾相接,于是链减少了一条。

而最大匹配等于最小点覆盖等于 \(2n\) 减去最大独立集,所以原图的最小链覆盖加 \(n\) 就是二分图的最大独立集。

最长反链

这里只研究是偏序集的情况。

dilworth 定理就是最小链覆盖等于最长反链。

首先最小链覆盖肯定大于等于最长反链,因为最长反链上的每一个点都不在同一条链上。

下面归纳证明最小链覆盖等于最长反链,首先 \(n=1\) 时命题成立。

对于 \(n>1\) 我们取出点集中的极大元 \(x\),它肯定没有出边,且取出之后的图 \(G'\) 满足最小链覆盖等于最长反链。假设 \(G'\) 中最小链覆盖有 \(k\) 条链,那么最长反链也有 \(k\) 个点。

首先显然我们可以随便取一组最小链覆盖,那么对于任意的最长反链,它的 \(k\) 个点肯定在每一条链上恰好一个,因为反链上的两个点不能在同一条联赛上。发现如果我们把每一条链上的极大元取出来,这就是一组最长反链,因为如果链 A 的极大元有边连往链 B 的极大元,那么链 A 的全部点都会向链 B 的极大元连边,与链 A 必然会选一个矛盾。

设这些最大值组成的集合为 B,显然加入 \(x\) 后最小链覆盖和最长反链都增加不超过 1。

  1. B 中所有元素都没有向 \(x\) 连边,那么 B 可以直接加入 \(x\),所以最小链覆盖小于等于最长反链,又因为大于等于,所以等于。
  2. B 中有元素向 \(x\) 连边,那么 \(x\) 可以加入那条链,所以最小链不增加,所以证出小于等于,所以等于。

所以就证完了,总结一下就是对于一个 \(n\) 个点的偏序集:最长反链=最小链覆盖=n-对应的二分图的最大匹配=n-对应的二分图的最小点覆盖=n+对应的二分图的最大独立集。

标签:二分,匹配,覆盖,最小链,等于,反链
From: https://www.cnblogs.com/xzzduang/p/17205690.html

相关文章

  • 整体二分板子
    P3834可持久化线段树2静态区间第\(k\)小。存个不带修整体二分板子。离散化,拿树状数组维护一下元素出现次数。假设当前区间内所有答案都是\(mid\)。实时更新,这样......
  • 算法基础课笔记:第一章,基础算法 排序 + 二分
    这节课的内容排序快排归并排序二分整数二分浮点数二分如何提高自己敲模板的熟练度呢?反复的练,孰能生巧。重复3-5次。快排1.确定分界点2.调整区......
  • 二分法
      #include<iostream>usingnamespacestd;constintN=1e5+10;inta[N],st[N];intnum=0;intmain(){intn,q;cin>>n>>q;for(inti=1;i<=n;i++){cin>>a[i];......
  • 整数二分的边界条件
     有单调性的题目一定可以二分,没有单调性的可能可以二分,二分和单调性没有直接关系。整数二分的本质是边界,整个区间可以一份为二,一半满足一半不满足,则二分即可以找前一半......
  • 这个二分查找好难(Drying)
    DryingItisveryhardtowashandespeciallytodryclothesinwinter.ButJaneisaverysmartgirl.Sheisnotafraidofthisboringprocess.Janehasdecided......
  • HDU2199 Can you solve this equation? (二分查找)
    Canyousolvethisequation?TimeLimit:2000/1000MS(Java/Others)    MemoryLimit:32768/32768K(Java/Others)TotalSubmission(s):12794    AcceptedS......
  • 环形链表(哈希表、链表)、寻找两个正序数组的中位数(数组、二分查找)、二进制求和(位
    环形链表(哈希表、链表)给定一个链表,判断链表中是否有环。如果链表中有某个节点,可以通过连续跟踪next指针再次到达,则链表中存在环。为了表示给定链表中的环,我们使用整......
  • 【二分查找】LeetCode 4. 寻找两个正序数组的中位数
    题目链接4.寻找两个正序数组的中位数思路分治代码classSolution{publicdoublefindMedianSortedArrays(int[]nums1,int[]nums2){if(nums1.len......
  • 今日学习之二分法排序
    二分法排序主要思想是在数组中截取一个数center,然后将数组分成leftArr、rightArr两部分,其中leftArr全部小于center,rightArr全部大于center(这里没有考虑有重复值的情况),最后......
  • 浅谈二分标准模板以及边界变形
    1.5、搜索算法1.5.1、折半搜索(二分)二分的基础的用法是在单调序列或单调函数中进行查找。因此当问题的答案具有单调性时,就可以通过二分把求解转化为判定。1.5.1.1、标准......