首页 > 其他分享 >二分图相关

二分图相关

时间:2024-07-16 20:54:00浏览次数:17  
标签:二分 原图 匹配 覆盖 标记 右部点 相关

% \(\rm \color{red}{L}\color{black}{BY}\) 学长。

0.定义:

  • 二分图:

二分图是一张图 \(G = (V, E)\),其中点集 \(V\) 可以分成两个部分 \((V1, V2)\),满足 \(V1 \cap V2 = \emptyset, V1 \cup V2 = V\),且 \(V1, V2\) 中均没有边,即对于 \(\forall e \in E, e = (v_i, v_j)\),均有 \(v_i \in V1, v_j \in V2\)。注意:接下来称 \(V1\) 为左部点,\(V2\) 为右部点。

  • 匹配:

一张图的匹配定义为一个原图的一个子图,且满足任意两条边均没有公共端点。一个匹配的大小定义为其中边的个数,一个图的最大匹配定义为匹配的大小最大的一个匹配。特殊的,对于一个匹配且该匹配完全包含左部点或右部点时,我们称该匹配是完美匹配完美匹配一定是原图中的最大匹配

  • 点覆盖:

一张图的覆盖定义为原图中点集的一个子集,满足原图中每条边均有一个端点在该点集中。一个覆盖的大小定义为点集的大小,最小点覆盖就是原图中最小的覆盖。

  • 独立集:

一张图的独立集定义为原图中点集的一个子集,满足原图中每条边的端点至少有一个不在该点集中。一个覆盖的大小定义为点集的大小,最大独立集就是原图中最大的独立集。

1.二分图最大匹配:

二分图中的最大匹配求法较一般图是简单的,我们接下来探究对于二分图如何求最大匹配。

我们要引入匈牙利算法。依次考虑左部点并进行匹配,假设我们考虑到第 \(i\) 个点。我们找到与之相连的且没有标记过的右部点 \(v\),并做标记,若 \(v\) 没有匹配,则给让 \(v\) 跟 \(i\) 匹配并返回 \(i\) 匹配成功。否则我们考虑更换与 \(v\) 匹配的左部点的匹配点,若更换成功,则将 \(v\) 与 \(i\) 匹配,否则考虑下一个点。当 \(i\) 一个点都没有匹配到时,返回没有找到即可。

注:其中我们称该过程中走的边为增广路交替路,因为这条路径上的边是匹配边和非匹配边交替的。

匈牙利算法看起来相当暴力,实际上,它的时间复杂度为 \(O(n^3)\)。

code
bool dfs(int u){
	for(int i = 1; i <= n; i++){
		if(!vis[i] && G[u][i]){
			vis[i] = true;
			if(!match[i] || dfs(match[i])){
				match[i] = u;
				return true;
			}
		}
	}
	return false;
}

2.二分图最小点覆盖:

对于求解二分图中的最小点覆盖问题,我们可以考虑将其转化为最大匹配问题求解。

König定理:二分图中,最大匹配等于最小点覆盖

  • 证明:

首先我们可以知道最大匹配 \(\le\) 最小点覆盖。因为最小点覆盖至少要覆盖到匹配边,而匹配边端点互不相交,故每条匹配边都需要一个单独的点去覆盖。

接下来我们考虑构造出一种方案取到下界。具体方案是从未匹配的右部点出发,走交替路并且标记经过的点,最后选择左边标记的点和右边未标记的点。画图容易发现每个点恰好是一条匹配边的端点,原因大概是从左向右走的一定是匹配边,因此左边标记过的点如果是匹配点,一定会将所在匹配边的右部点标记而不会选进点集中。而右边未标记的点一定是匹配点,于是恰好覆盖了所有匹配边且恰好没有重复。

对于完全覆盖的证明,我们考虑使用反证法,假设有一条边没有被覆盖到,则它对应的左部点一定是未标记过,而右部点是标记过的。进一步的,该边不可能是未匹配边,但是若该边是匹配边,则右部点只可能是由左部点走过来,但是这样左部点就标记了,推出矛盾,从而定理得证。

3.二分图最大独立集:

与最小点覆盖问题类似,我们依旧考虑转化问题。

实际上,我们可以考虑将点覆盖与独立集建立映射关系。具体的,一个独立集的补集即为原图的一个点覆盖。这是因为独立集中的点两两之间没有任何边,于是剩下的点

标签:二分,原图,匹配,覆盖,标记,右部点,相关
From: https://www.cnblogs.com/little-corn/p/18306004

相关文章

  • 浏览器工作过程及相关名词
    网页获取在计算机网络中,双方通过知道彼此的IP地址,即可建立通信通信协议包括TCP与UDP两种,其中:TCP建立连接过程如下(三次挥手):sequenceDiagramparticipantAparticipantBA->>B:SYNB->>A:SYN,ACKA->>B:ACKTCP断开连接过程如下(四次握手):sequenceDiagrampart......
  • 云计算实训06——find、stat、touch、tree、scp、crontab指令相关应用
    一、find命令1.find的作用:对文件进行搜索2.基本语法:                    find[文件路径][选项选项的值]3.常见的选项-name根据文件的名称搜索文件,支持通配符*-typef 代表普通文件,-typed代表目录4.*通配符在l......
  • MySQL版本的相关问题:com.mysql.cj.jdbc.Driver和com.mysql.jdbc.Driver
    原文链接:https://www.cnblogs.com/daemonFlY/p/9820541.html1.在使用mysql时,控制台日志报错如下:Loadingclass`com.mysql.jdbc.Driver'.Thisisdeprecated.Thenewdriverclassis`com.mysql.cj.jdbc.Driver'.ThedriverisautomaticallyregisteredviatheSPIand......
  • 了解一下人工智能(AI)相关概念
    人工智能(AI)不仅仅是一个技术流行语,其是一种迅速重塑我们生活和工作方式的变革力量。当我们站在一个新时代的顶端时,人工智能技术已经做好了未来的准备,在各个领域释放出前所未有的可能性。现在各种关于人工智能的技术层出不穷,每种不同的技术所针对的技术重点不同,现在就让我们根据......
  • 【C++】链表相关的项目(2.0)
    链表相关的项目1.0需要请点击       ---------------------------------------------------准备工作首先弄几个可能会需要的头文件:#include<stdio.h>#include<stdlib.h>#include<string.h>typedefintADT;//定义自定义数据类型​​因为写的是关于......
  • 底软驱动 | 大厂面试爱考的C++内存相关
    文章目录C++内存相关C++内存分区C++对象的成员函数存放在内存哪里堆和栈的区别堆和栈的访问效率“野指针”有了malloc/free为什么还要new/deletealloca内存崩溃C++内存泄漏的几种情况内存对齐柔性数组参考推荐阅读C++内存相关本篇介绍了C++内存相关的知识。C++......
  • 信息安全从业者考试认证大全_信息化相关的证书
    证书是IT从业者知识水平能力的一个体现,考证同时也是拓展自身知识的一个方法。近年来,安全行业风生水起,各种认证层出不穷,眼花缭乱。这里不对任何一个证书做评价,只是做出介绍,在国内,对任何事物的评价都会引起围攻。所以笔者不敢妄谈一个证书的含金量,会具体谈到每个证书笔者所了......
  • 前端开发中的二分查找算法
    在前端开发中,处理和搜索大量数据时,效率是一个关键因素。二分查找算法是一种高效的查找算法,适用于在有序数组中快速找到目标值。本文将详细介绍二分查找算法的基本原理、实现方法及其在前端开发中的应用。什么是二分查找?二分查找(BinarySearch)是一种在有序数组中查找目标值的算法......
  • 网络安全相关的一些学习笔记
    网络安全?本文主要为《计算机网络》网络安全章节的学习笔记,也包括部分来自其他博客与网站的段落。1.一些名词解释密码编码学(cryptography):密码体制的设计学密码分析学(cryptanalysis):在未知密钥的情况下从密文推演出明文或密钥的技术上述二者合称密码学(cryptology)无条件安全(理......
  • JVM相关面试题
    来自黑马程序员(新版Java面试专题视频教程,java八股文面试全套真题+深度详解(含大厂高频面试真题)_哔哩哔哩_bilibili)目录5.1JVM组成面试官:JVM由那些部分组成,运行流程是什么?面试官:能不能解释一下方法区?面试官:你听过直接内存吗?面试官:什么是虚拟机栈面试官:能说一下堆栈的区别......