C++题解:P1894 [USACO4.2]完美的牛栏The Perfect Stall —— 求二分图的最大匹配算法其一:匈牙利算法 (增广路,匹配,最大匹配)

本文介绍了二分图的概念、匹配与最大匹配,并重点讲解了匈牙利算法,包括增广路的寻找及其在算法中的应用。文中还提供了关键的C++代码实现,并附带了数论模板,如快速读入、扩展欧几里得算法、求逆元等。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

在看这道题之前,我们先来了解一下什么是二分图及与二分图匹配的相关概念及基础知识。

基础知识

故名思义,二分图本质上还是由点和边构成的数据结构,与之不同的是,二分图相当于把一张图分成了两个部分,也就是两个部。部与部之间的点没有边相连,以下的几个图都可以算作二分图:
在这里插入图片描述图中(图中的箭头无意义,并不代表有向边)
现在来简单说一下匹配和最大匹配(因为只涉及匈牙利算法,所以不讲其他杂七杂八的东西。最小点覆盖什么的以后再讲)
简单来说匹配就是从二分图中选出一些边,这些边没有共同的顶点。这些边组成的边集就叫做这个二分图中的一个边集。下面是一个例子,红色边便是匹配:
在这里插入图片描述
最大匹配就是匹配中边数最大的一个匹配。如图为上图的一个最大匹配(注意!最大匹配并不是唯一的)
在这里插入图片描述
关于匈牙利算法,还有一个重要的概念,便是增广路。增广路在各种算法中都有很大的作用。这里只讲解一下其最基本的一些概念。
增广路的意义便是选取一个不在任何匹配中的一条边作为起点,再选取一条与它相邻的匹配中的一条边,下下一条边又是一条与下一条边相邻的边的不在匹配中的一条边。连在一起交错进行终点不为匹配中的边便是一条增广路。(相信你已经看懵了,下面便给出流程来)
在这里插入图片描述这是一个二分图的匹配,
从任意一个顶点开始进行增广路后:
在这里插入图片描述
(x2,y1)不在匹配中,作为起点。所以整个增广路就为:(x2,y1)-(y1,x1)-(x1,y3)-(y3,x4)-(x4,y2)。
绿色边为不在匹配中的边。现在我们将绿色边转为红色边,红色边转为绿色边:

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值