图的匹配相关学习笔记

news2024/12/28 15:58:31

二分图最大匹配

二分图是一种奇妙的图,它满足可以把其内部的节点划分成两个集合,且这每个集合内部的的点没有边相连。

这就是一个二分图

二分图的判定

二分图的判定定理:一张无向图是二分图,当且仅当图中不存在奇环(长度为奇数的环)。

于是乎,对于二分图的判定,我们可以使用染色的方法。尝试用黑和白两种颜色标记图中的点,当一个节点被标记了,那么所有与它相连的点应全部标记为相反的颜色,如果在标记过程中出现颜色冲突,那么算法结束,图中存在奇环,不为二分图;否则,本图是二分图。

对于二分图的判定,还有一种利用并查集的判定方式,相较于染色法在时间复杂度上更优,但是我还不会诶/kk。

二分图最大匹配

匈牙利算法,是一种解决二分图最大匹配问题的算法。

知道了二分图是什么,我们还需要知道“匹配”是什么。我们称图 G G G 的一个匹配是由一组没有公共端点的边的集合。最大匹配包含的边数即为最大匹配。

归纳一下,对于一个匹配有两点要求:

  • 匹配是边的集合

  • 在匹配中,任意两边不能有公共顶点

然后我们就可以开始解决二分图的最大匹配问题啦!

我们形象地描述一下这个问题,对于上面的二分图, U U U 表示男生, V V V 表示女生,两集合中点之间的边表示两人有暧昧关系,作为一名单身狗,你的目的是尽可能多地撮合情侣,这就是找最大匹配的过程。但是注意,如果一个人已经有了男/女朋友就不能在找别的了,这就是要满足“任意两边不能有公共顶点”。

下面模拟匈牙利算法的过程:

  1. U U U 中的第一个 U 1 U_1 U1 寻求匹配,发现只能到 V 1 V_1 V1,所以这一对可以;
  2. 再看 U 2 U_2 U2,发现它可以到 V 1 V_1 V1 V 2 V_2 V2,但是 V 1 V_1 V1 已经有男朋友了,虽然 U 2 U_2 U2 是海王但是它不会抢别人的女友,并且 U 1 U_1 U1 只能和 V 1 V_1 V1 在一起,所以 U 2 U_2 U2 只好去找 V 2 V_2 V2 了;
  3. 再看 U 3 U_3 U3,发现它可以到 V 3 V_3 V3 V 4 V_4 V4,这两个人都没有男朋友,所以先假设 U 3 U_3 U3 V 3 V_3 V3 在一起了。
  4. 再看 U 4 U_4 U4,发现它只能到 V 2 V_2 V2,可是 V 2 V_2 V2 已经名花有主了,考虑让 U 2 U_2 U2 换一个目标,但是 U 2 U_2 U2 的另一个暧昧对象已经给 U 1 U_1 U1,根据“先来后到”原则, U 4 U_4 U4 就和我们一样注定单身了;
  5. 最后看 U 5 U_5 U5,可以到 V 1 V_1 V1 V 5 V_5 V5 V 5 V_5 V5 刚好没有男朋友,所以 U 5 U_5 U5 就开开心心地抱得美人归了。

时间复杂度 O ( V E ) O(VE) O(VE)


具体代码实现如下:

#include <bits/stdc++.h>
using namespace std;

const int maxn=5e4+5;
int head[maxn],nxt[maxn],to[maxn],vis[maxn],cnt,match[505]/*表示右边点对应左边的cp*/,m,n,e;

void add(int x,int y)
{
	to[++cnt]=y;
	nxt[cnt]=head[x];
	head[x]=cnt;
}

bool dfs(int now)//找对象
{
	for(int i=head[now];i;i=nxt[i])
	{
		if(vis[to[i]]) continue;
		vis[to[i]]=1;
		if(!match[to[i]]||dfs(match[to[i]]))//想找的对象没有男朋友或者这个对象的当前男朋友还可以找别的女朋友
		{
			match[to[i]]=now;//左侧元素和当前的右侧元素形成匹配
			return 1;
		}
	}
	return 0;
}

int main()
{
	cin>>n>>m>>e;
	for(int i=1;i<=e;i++) 
	{
		int u,v;cin>>u>>v;
		add(u,v);
	}
	int ans=0;
	for(int i=1;i<=n;i++)
	{
		memset(vis,0,sizeof(vis));
		if(dfs(i)) ans++;
	}
	cout<<ans;
	return 0;
}

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.coloradmin.cn/o/1116612.html

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈,一经查实,立即删除!

相关文章

VisualStudio安装VSIX离线包的方法

一、安装的原理 1、使用的window工具&#xff1a;CMD或者powerShell 2、vs中用于安装vsix的exe&#xff1a; 二、安装过程 1、在VSIXInstaller.exe同级目录启动PowerShell &#xff08;1&#xff09;鼠标移到空白处 &#xff08;2&#xff09;Shift 鼠标右键 &#xff08;…

物联网_00_物理网介绍

1.物联网为什么会出现? 一句话-----追求更高品质的生活, 随着科技大爆炸, 人类当然会越来越追求衣来伸手饭来张口的懒惰高品质生活, 最早的物联网设备可以追溯到19世纪末的"在线可乐售卖机"和"特洛伊咖啡壶"(懒惰的技术人员为了能够实时看到物品的情况而设…

BAT032:批量替换当前目录下文件的部分字符

引严&#xff1a;编写批处理程序&#xff0c;实现批量替换当前目录下文件的部分字符。 一、新建Windows批处理文件 参考博客&#xff1a; CSDNhttps://mp.csdn.net/mp_blog/creation/editor/132137544 二、写入批处理代码 1.右键新建的批处理文件&#xff0c;点击【编辑】。…

飞速(FS)MTP®光纤跳线系列——数据中心布线理想选择

数据中心的重要定位要求其使用的光纤跳线具有高性能和高可靠性。飞速&#xff08;FS&#xff09;MTP光纤产品系列能够以简单的安装方式快速部署高密度链路&#xff0c;优化线缆管理&#xff0c;确保充分利用通道空间&#xff0c;显著减少安装时间和成本。 飞速&#xff08;FS&…

线性代数-Python-02:矩阵的基本运算 - 手写Matrix及numpy中的用法

文章目录 一、代码仓库二、矩阵的基本运算2.1 矩阵的加法2.2 矩阵的数量乘法2.3 矩阵和向量的乘法2.4 矩阵和矩阵的乘法2.5 矩阵的转置 三、手写Matrix代码Matrix.pymain_matrix.pymain_numpy_matrix.py 一、代码仓库 https://github.com/Chufeng-Jiang/Python-Linear-Algebra-…

uni-app:实现时钟自走(动态时钟效果)

效果 核心代码 使用钩子函数 mounted()&#xff0c;设置定时器&#xff0c;是指每秒都要去执行时间的获取&#xff0c;以至于实现时间自走的效果 mounted() { this.updateTime(); // 初始化时间 setInterval(this.updateTime, 1000); // 每秒更新时间 }, 自定义方法…

2022年亚太杯APMCM数学建模大赛E题有多少核弹可以摧毁地球求解全过程文档及程序

2022年亚太杯APMCM数学建模大赛 E题 有多少核弹可以摧毁地球 原题再现 1945年8月6日&#xff0c;第二次世界大战即将结束。为了尽快结束战争&#xff0c;美国在日本广岛投下了下一颗名为“小男孩”的原子弹。这样一颗原子弹在广岛炸死了20万人&#xff0c;广岛的所有建筑物都…

BAT033:批量删除文件特定字符及特定字符之后的字符

引言&#xff1a;编写批处理程序&#xff0c;实现批量删除文件特定字符及特定字符之后的字符。 一、新建Windows批处理文件 参考博客&#xff1a; CSDNhttps://mp.csdn.net/mp_blog/creation/editor/132137544 二、写入批处理代码 1.右键新建的批处理文件&#xff0c;点击【…

【计算机网络】OSI参考模型中非端-端层(物理层、数据链路层、网络层)功能介绍

系列文章目录 什么是计算机网络&#xff1f; 什么是网络协议&#xff1f; 计算机网络的结构 数据交换之电路交换 数据交换之报文交换和分组交换 分组交换 vs 电路交换 计算机网络性能&#xff08;1&#xff09;——速率、带宽、延迟 计算机网络性能&#xff08;2&#xff09;…

表示本机IP地址的方式(三种方式)

1、本机和网络上的其他主机都可以通过IP地址访问到服务器 2、通过 127.0.0.1 或者 localhost 访问 127.0.0.1 和 localhost 它们完全等价 只能 本机 通过 127.0.0.1 或者 localhost 访问&#xff0c;网络上的其他主机无法访问 3、 通过 0.0.0.0 访问服务器 表示所有可…

Element Plus el-form表单自定义插槽如何使用

//正常无插槽表单<el-form :model"form" label-width"120px"><el-form-item label"Activity name"><el-input v-model"form.name" /></el-form-item></el-form>//带插槽表单//适用二次封装的form组件&l…

计算机网络篇之TCP滑动窗口

文章目录 前言概述 前言 在网络数据传输时&#xff0c;若传输的原始数据包比较大&#xff0c;会将数据包分解成多个数据包进行发送。需要对数据包确认后&#xff0c;才能发送下一个数据包。在等待确认包的这个过程浪费了大量的时间&#xff0c;不过还好TCP引入了滑动窗口的概念…

如何开发一个 Safari 插件

本文字数&#xff1a;2493字 预计阅读时间&#xff1a;15分钟 由于常用浏览器是Safari&#xff0c;而Safari浏览器的插件比不上Chrome&#xff0c;所以就有了自己开发常用的Safari插件的想法。 打算开发当前页面生成二维码的Extension&#xff0c;因为网络原因&#xff0c;AirD…

微软正式发布开源应用平台 Radius平台

“ 10 月 18 日&#xff0c;微软 Azure 孵化团队正式发布开源应用平台 Radius&#xff0c;该平台将应用程序置于每个开发阶段的中心&#xff0c;重新定义应用程序的构建、管理与理解方式。” 简单的概括就是&#xff0c;它和Kubernetes不一样&#xff0c;Radius将应用程序放在每…

DevExpress WPF Pivot Grid组件,可轻松实现多维数据分析!(二)

在上文中&#xff08;点击这里回顾>>&#xff09;我们主要为大家介绍了DevExpress WPF Pivot Grid组件的超快速枢轴分析功能、Microsoft分析服务等&#xff0c;本文将继续介绍图表透视数据的处理、MVVM支持等。欢迎持续关注我们&#xff0c;探索更多新功能哦~ P.S&#…

LNMP架构部署Discuz论坛系统

文章目录 LNMP架构&部署Discuz论坛系统部署LNMP架构环境前期准备安装Nginx安装mariadb安装php配置nginx 部署Discuz论坛系统下载Discuz论坛系统代码包部署Discuz论坛系统配置虚拟主机安装Discuz论坛访问站点尝试注册一个账号 LNMP架构&部署Discuz论坛系统 部署LNMP架构…

R语言:主成分分析PCA

文章目录 主成分分析处理步骤数据集code 主成分分析 主成分分析&#xff08;或称主分量分析&#xff0c;principal component analysis&#xff09;由皮尔逊&#xff08;Pearson,1901&#xff09;首先引入&#xff0c;后来被霍特林&#xff08;Hotelling,1933&#xff09;发展…

xtrabackup恢复数据时提示“This target seems to be not preared yet.”

测试MySQL数据库备份文件可用性。 备份文件是腾讯云平台备份的MySQL。文件需要xtrabackup恢复。 执行到xtrabackup --prepare --target-dir./mysql时&#xff0c;没有像往常开始执行命令而是给出了一个简短提示。 “This target seems to be not preared yet.” 为了确认前面…

软件工程与计算总结(二十二)软件开发过程模型

&#xff08;自顶向下&#xff0c;逐层细化&#xff09; 目录 一.软件开发的典型阶段 1.需求工程 2.软件设计 3.软件构造 4.软件测试 5.软件交付 6.软件维护 二.软件生命周期模型 三.软件过程模型 四.构建-修复模型 五.瀑布模型 六.增量迭代模型 七.演化模型 八…

Leetcode 第 361 场周赛题解

Leetcode 第 361 场周赛题解 Leetcode 第 361 场周赛题解题目1&#xff1a;2843. 统计对称整数的数目思路代码复杂度分析 题目2&#xff1a;生成特殊数字的最少操作思路代码复杂度分析 题目3&#xff1a;统计趣味子数组的数目思路代码复杂度分析 题目4&#xff1a;边权重均等查…