首页 > 其他分享 >浅谈二分图

浅谈二分图

时间:2024-08-25 13:36:52浏览次数:5  
标签:二分 匹配 浅谈 增广 int 条边 match

定义

二分图,又称二部图,英文名叫 Bipartite graph。

二分图是什么?节点由两个集合组成,且两个集合内部没有边的图。

换言之,存在一种方案,将节点划分成满足以上性质的两个集合。

img

性质

  • 如果两个集合中的点分别染成黑色和白色,可以发现二分图中的每一条边都一定是连接一个黑色点和一个白色点。
  • 二分图不存在长度为奇数的环,因为每条边的 \(u\) 在一个集合, \(v\) 在另一个集合,所以想要从一个点出发,再回到这个点可能经过偶数条边。

应用

二分图最大匹配

增广路算法 (Augmenting Path Algorithm)

假设有 \(n\) 个顶点,\(m\) 条边。

因为增广路长度为奇数,路径起始点非左即右,所以我们先考虑从左边的未匹配点找增广路。 注意到因为交错路的关系,增广路上的第奇数条边都是非匹配边,第偶数条边都是匹配边,于是左到右都是非匹配边,右到左都是匹配边。 于是我们给二分图 定向,问题转换成,有向图中从给定起点找一条简单路径走到某个未匹配点,此问题等价给定起始点 \(s\) 能否走到终点 $t $ 。 那么只要从起始点开始 DFS 遍历直到找到某个未匹配点,\(O(m)\)。未找到增广路时,我们拓展的路也称为 交错树

代码

#include <bits/stdc++.h>
using namespace std;
int n,m,t,book[505],match[505];
vector <int> e[505]; 
int dfs(int x,int tag)
{
	if(book[x]==tag)return 0;
	book[x]=tag;
	for(auto v : e[x])
	{
		if((match[v]==0)||dfs(match[v],tag))//这个人还没有选或者让与它连边的点换一个点连边
		{
			match[v]=x;
			return 1;//匹配成功
		}
	}
	return 0;
}
int main()
{
	scanf("%d%d%d",&n,&m,&t);
	for(int i=1;i<=t;i++)
	{
		int u,v;
		scanf("%d%d",&u,&v);
		e[u].push_back(v);
	}
	int sum=0;
	for(int i=1;i<=n;i++)
	{
		if(dfs(i,i))
		{
			sum++;
		}
	}
	cout<<sum;
	return 0;
}

二分图最小点覆盖(König 定理)

最小点覆盖:选最少的点,满足每条边至少有一个端点被选。

二分图中,最小点覆盖 \(=\) 最大匹配。

二分图最大独立集

最大独立集:选最多的点,满足两两之间没有边相连。

因为在最小点覆盖中,任意一条边都被至少选了一个顶点,所以对于其点集的补集,任意一条边都被至多选了一个顶点,所以不存在边连接两个点集中的点,且该点集最大。因此二分图中,最大独立集 \(=\) \(n-\)最小点覆盖。

标签:二分,匹配,浅谈,增广,int,条边,match
From: https://www.cnblogs.com/tyccyt/p/18378884

相关文章

  • 浅谈一类第 k 大问题
    浅谈一类第k大问题IntroductiontoK-thLargestProblems本文介绍一类第k大问题的处理方法。LuoguP1631序列合并LuoguP2048[NOI2010]超级钢琴LuoguP5283[十二省联考2019]异或粽子CodeForces241BFriends基本思想:先找到部分答案,通过这部分答案更新可能的......
  • 整体二分
    前置知识:二分,一些数据结构如树状数组用途:用于解决多次可二分可离线的询问。可以使用整体二分解决的题目应具有以下性质:询问的答案具有可二分性。修改对判定答案的贡献互相独立,修改之间互不影响效果。修改如果对判定答案有贡献,则贡献为一确定的与判定标准无关......
  • 浅谈红队攻防之道-CobaltStrike钓鱼攻击集锦
    打个比方,一片大地上,躺着一群沉睡的人,远处就是火山,马上就要爆发了,你就像个闹钟,面对这些沉睡的人,你想把他们叫醒。你持续不断地响着,有的睡得浅的人,被你叫醒了,跟你一块去叫醒众人,但是人数太多了,你们的声音太微弱了,叫醒的人毕竟有限,而且保不齐有的人嫌烦,时不时还踢坏两个。那......
  • 浅谈C#中的值类型和引用类型
    1.值类型常见的值类型:int/long/short/byte/float/double/bool/char/Struct(用户建立的结构体通常是值类型的)/NullableTypes(这是一个特殊的值类型,表示一个正常值或者空,比如int?)值类型的例子:inta=10;intb=a;Console.WriteLine($"a:{a}");//a:10Console.WriteLine($"b:......
  • 浅谈 pb_ds 库
    大部分是在wiki搬运的,只是方便我看简介pb_ds库封装了很多数据结构,比如哈希(Hash)表,平衡二叉树,字典树(Trie树),堆(优先队列)等。就像vector、set、map一样,其组件均符合STL的相关接口规范。部分(如优先队列)包含STL内对应组件的所有功能,但比STL功能更多。可以使用begin()和e......
  • wqs 二分学习笔记
    蒟蒻的第一篇学习笔记qwqwqs二分用于解决此类问题n个物品,从中选恰好m个,最大化收益。而且你发现,如果没有选m个的限制,这道题是非常好做的。使用前提1、恰好选k个,至多至少不行2、答案满足凸性什么是凸性?设选i个物品时的收益为fi如果把它画成函数,那么它长这样(上凸包)或者这样......
  • 浅谈Java MyBatis
    一、MyBatis的基本介绍  MyBatis本是apache的一个开源项目iBatis,2010年这个项目由apachesoftwarefoundation迁移到了googlecode,由谷歌托管,并且改名为MyBatis。2013年11月迁移到Github。    MyBatis是支持普通SQL查询,存储过程和高级映射的优秀持久层框架。......
  • 浅谈对Maven的理解
    一、基本介绍Maven——是Java社区事实标准的项目管理工具,能帮你从琐碎的手工劳动中解脱出来,帮你规范整个组织的构建系统。不仅如此,它还有依赖管理、自动生成项目站点等特性,已经有无数的开源项目使用它来构建项目并促进团队交流,每天都有数以万计的开发者在访问中央仓库以获取......
  • 浅谈Redis(一)
    浅谈Redis(一)文章目录浅谈Redis(一)Redis的特点Redis线程模型Redis单线程为什么快Redis持久化方案Redis缓存淘汰策略Redis缓存穿透、击穿和雪崩区别和解决方案Redis是一个开源的内存数据结构存储系统,可以用作数据库、缓存和消息中间件。Redis支持多种数据结构,比如str......
  • 浅谈Kafka(一)
    浅谈Kafka(一)文章目录浅谈Kafka(一)Kafa的设计是什么样的数据传输的事务定义消息队列的应用场景Kafka怎么样判断节点是否存活Kafka的消息是采用pull模式还是push模式Kafka在磁盘上的消息格式Kafka高效文件存储设计特点Kafka与传统消息系统之间的区别Kafka的分区数据怎样保......