Hall定理学习笔记

news/2025/10/11 13:06:29/文章来源:https://www.cnblogs.com/Tachanka233/p/19133688

内容

设二分图左部点点数为 \(x\),右部点点数为 \(y\),且满足 \(x<y\)。定义一张二分图的完备匹配为:对于任意一个左部点都有与之匹配的右部点。

\(\text{Hall}\) 定理的内容是:一张二分图有完备匹配,等价于对于任意左部点的集合 \(S\),满足 \(|\{y|\exists x\in S, 边 (x,y) 存在\}|\ge |S|\),即 \(S\) 的邻域大小(记为 \(N(S)\))不小于 \(S\) 本身。

证明

必要性显然。反证即可。

下面证明充分性。

用归纳法证明。当 \(n=1\)\(\text{Hall}\) 定理显然成立。
\(n>1\) 时,选取其中任意一对匹配的点删去,剩下的点仍然满足 \(\text{Hall}\) 定理。
于是由归纳法得证。

拓展

\(\text{Hall}\) 定理在带权情况下(一个点能和多个点匹配)仍然成立。将一个点拆成 \(a_i\) 个点即可。

二分图最大匹配等于 \(x+\min\{|S|-N(S)\}\)

应用

QOJ12015 撸猫

将源点向每只猫连边 \(p_i\),每只猫和每个集合连边 \(\infty\),再从每个集合向汇点连边 \(x_i\) 即可。然后发现这是一个二分图最大匹配的形式,于是用 \(\text{Hall}\) 定理求出每一个猫的集合对应的 \(c\),取最小值即可。用高维前缀和,时间复杂度 \(\mathcal{O}(n2^n)\)

要注意应当把 \(\sum\limits{x_i}\) 当做 \(1\)

#include <bits/stdc++.h>
using namespace std;
constexpr int N=1<<20;
constexpr double eps=1e-12;
int n;
double a[N],b[N];
signed main(){ios::sync_with_stdio(false);cin.tie(0),cout.tie(0);cin>>n;cout<<fixed<<setprecision(8);for(int i=0;i<1<<n;i++){cin>>a[i];for(int j=0;j<n;j++)if((i>>j)&1)b[j]+=a[i];}for(int i=0;i<n;i++){for(int j=0;j<1<<n;j++){if((j>>i)&1)a[j]+=a[j^(1<<i)];}}double ans=1;for(int i=0;i<1<<n;i++){double s=0;for(int j=0;j<n;j++)if((i>>j)&1)s+=b[j];if(s<eps)continue;ans=min(ans,(1-a[((1<<n)-1)^i])/s);}cout<<ans<<'\n';return 0;
}

CF1519F Chests and Keys

题目的限制等价于花 \(c_{i,j}\) 的代价连一条 \(i\)\(j\) 的边,要求整张图满足对于任意的箱子集合 \(S\),有 \(\sum\limits_{i\in S}a_i\ge\sum\limits_{\exists i\in S,存在(i,j)}b_j\)

观察到这个限制与上面 \(\text{Hall}\) 定理的第一个扩展形式类似,于是可以转化为最大流问题。然后 \(a,b\) 的值域都很小直接 \(5\) 进制状压类似模拟最大流即可。时间复杂度 \(O(n5^{2m})\),跑不满。

#include <bits/stdc++.h>
using namespace std;
int n,m,a[6],b[6],c[6][6],p5[7],dp[7][15625];
bool check(int x,int y){for(int i=0;i<m;i++)if(y/p5[i]%5<x/p5[i]%5)return 1;for(int i=0;i<m;i++)if(y/p5[i]%5>b[i])return 1;return 0;
}
signed main(){ios::sync_with_stdio(false);cin.tie(0),cout.tie(0);cin>>n>>m;for(int i=0;i<n;i++)cin>>a[i];for(int i=0;i<m;i++)cin>>b[i];for(int i=0;i<n;i++)for(int j=0;j<m;j++)cin>>c[i][j];p5[0]=1;for(int i=1;i<=m;i++)p5[i]=p5[i-1]*5;memset(dp,0x3f,sizeof(dp));int mask=0;for(int i=0;i<m;i++)mask+=b[i]*p5[i];dp[0][mask]=0;for(int i=1;i<=n;i++){for(int j=0;j<p5[m];j++){int s=0;for(int k=0;k<m;k++)s+=j/p5[k]%5;if(s!=a[i-1])continue;int sum=0;for(int k=0;k<m;k++)if(j/p5[k]%5)sum+=c[i-1][k];for(int k=0;k<p5[m];k++){if(check(j,k))continue;dp[i][k-j]=min(dp[i][k-j],dp[i-1][k]+sum);}}}int ans=0x3f3f3f3f;for(int i=0;i<p5[m];i++)ans=min(ans,dp[n][i]);cout<<ans<<'\n';return 0;
}

ARC076F Exhausted?

将每个人向每个在他范围内的坐标连边,则原问题相当于要加多少个点才能有完备匹配。完备匹配转化为最大匹配,然后就可以用第二个扩展形式,求的就是:

\[\max\{|S|-\max\limits_{i\in S}l_i+\min\limits_{i\in S}r_i-m-1\} \]

扫描线即可。

注意可能有区间不交的情况,所以至少加 \(n-m\) 个椅子。

#include <bits/stdc++.h>
using namespace std;
constexpr int N=2e5+5;
int n,m;
struct Node{int l,r;}a[N];
struct SegmentTree{int maxn[N<<2],tag[N<<2];#define ls(p) (p<<1)#define rs(p) (p<<1)|1void pushup(int p){maxn[p]=max(maxn[ls(p)],maxn[rs(p)]);}void pushdown(int p){maxn[ls(p)]+=tag[p];maxn[rs(p)]+=tag[p];tag[ls(p)]+=tag[p];tag[rs(p)]+=tag[p];tag[p]=0;}void update(int p,int l,int r,int val,int pl,int pr){if(l<=pl&&pr<=r){maxn[p]+=val;tag[p]+=val;return;}pushdown(p);const int mid=(pl+pr)>>1;if(mid>=l)update(ls(p),l,r,val,pl,mid);if(mid<r)update(rs(p),l,r,val,mid+1,pr);pushup(p);}int query(int p,int l,int r,int pl,int pr){if(l<=pl&&pr<=r)return maxn[p];pushdown(p);const int mid=(pl+pr)>>1;if(mid>=r)return query(ls(p),l,r,pl,mid);if(mid<l)return query(rs(p),l,r,mid+1,pr);return max(query(ls(p),l,r,pl,mid),query(rs(p),l,r,mid+1,pr));}
}tr;
signed main(){ios::sync_with_stdio(false);cin.tie(0),cout.tie(0);cin>>n>>m;for(int i=1;i<=n;i++)cin>>a[i].l>>a[i].r;sort(a+1,a+n+1,[](Node x,Node y){return x.l<y.l||(x.l==y.l&&x.r>y.r);});for(int i=0;i<=m+1;i++)tr.update(1,i,i,i,0,m+1);int ans=max(0,n-m);for(int i=1;i<=n;i++){tr.update(1,0,a[i].r,1,0,m+1);ans=max(ans,tr.query(1,0,m+1,0,m+1)-a[i].l-m-1);}cout<<ans<<'\n';return 0;
}

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

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

相关文章

面向对象抽象,接口多态综合-动物模拟系统

1、抽象一个动物类,会说话和走路。 public abstract class Animal() { public abstract void Speak(); public abstract void Walk(); } 2、抽象出能力,有的动物会飞,有的动物能用四条腿走路 interface IFly { void…

实用指南:APache shiro-550 CVE-2016-4437复现

pre { white-space: pre !important; word-wrap: normal !important; overflow-x: auto !important; display: block !important; font-family: "Consolas", "Monaco", "Courier New", …

Spark - deprecated registerTempTable() function

Spark - deprecated registerTempTable() functionIn Apache Spark, the function registerTempTable() was an old API (deprecated since Spark 2.0 and removed in Spark 3.0) that allowed you to register a Data…

MinGW-即时入门-全-

MinGW 即时入门(全)原文:zh.annas-archive.org/md5/a899d9a6a04025b2abd50163c83cff2a 译者:飞龙 协议:CC BY-NC-SA 4.0第一章. 立即开始使用 MinGW 欢迎使用 立即开始使用 MinGW。 本书特别创建,旨在为您提供所…

个人微信开发文档

个人微信开发文档、微信个人号api开发、微信机器人API 微信机器人是一种基于微信平台的自动化程序,能够根据用户的输入自动回复信息。它可以用于客服、信息查询、娱乐等多个场景。通过程序化的方式,微信机器人可以在…

Splay学习笔记

问题分析: (来源:洛谷P3369【模板】普通平衡树) 您需要动态地维护一个可重集合 \(M\),并且提供以下操作:向 \(M\) 中插入一个数 \(x\)。 从 \(M\) 中删除一个数 \(x\)(若有多个相同的数,应只删除一个)。 查询…

象棋图片转FEN字符串详细教程

如把下图转换成:3ak4/7R1/3aCcN2/p7p/6r2/9/Pr1p1n2P/4B1p2/9/2BAKA1R1 模型21K,Intel N100上训练时间0.969秒,识别时间0.957秒。识别率好像是100% 一、安装软件包 apt install python3-scipy python3-pil 二、建目…

自然语言处理在风险识别中的应用

本文介绍了如何利用自然语言处理和机器学习技术来识别和预测风险,包括在在线教育平台和产品开发阶段的应用,以及相关技术架构和团队构成。利用自然语言处理理解和识别风险 作为某中心的应用科学经理,Muthu Chandras…

详细介绍:正点原子【第四期】Linux之驱动开发学习笔记-6.1 pinctrl和gpio子系统

详细介绍:正点原子【第四期】Linux之驱动开发学习笔记-6.1 pinctrl和gpio子系统pre { white-space: pre !important; word-wrap: normal !important; overflow-x: auto !important; display: block !important; font-…

cat

基本概述 cat命令来自英文词组”concatenate files and print“的缩写,其功能是用于在终端设备上显示文件内容。在Linux系统中有很多用于查看文件内容的命令,例如more、tail、head等,每个命令都有各自的特点。cat命…

深入解析:可持续金融的新范式:拆解欧盟ESG监管体系及其全球影响力

pre { white-space: pre !important; word-wrap: normal !important; overflow-x: auto !important; display: block !important; font-family: "Consolas", "Monaco", "Courier New", …

Docker和K8S的区别详解 - 指南

Docker和K8S的区别详解 - 指南2025-10-11 12:39 tlnshuju 阅读(0) 评论(0) 收藏 举报pre { white-space: pre !important; word-wrap: normal !important; overflow-x: auto !important; display: block !importan…

qt everywhere souce code编译 - 实践

qt everywhere souce code编译 - 实践pre { white-space: pre !important; word-wrap: normal !important; overflow-x: auto !important; display: block !important; font-family: "Consolas", "Mona…

2023 CCPC final G

G. China Convex Polygon Contest 反悔贪心。 首先可以考虑对 \(b\) 排序,显然思考越快的题可以使手里攒着的题更多更有选择的空间。 如果正着贪心的话就是,当前能做就立马提交,如果当前的时间更优但选不了就从之前…

完整教程:微软 Azure AI 视频翻译服务助力 JowoAI 实现短剧高效出海

完整教程:微软 Azure AI 视频翻译服务助力 JowoAI 实现短剧高效出海pre { white-space: pre !important; word-wrap: normal !important; overflow-x: auto !important; display: block !important; font-family: &qu…

2025 年高可靠性测试设备/HALT/HASS/Halt/Hass/厂家制造商推荐榜:聚焦高效质量解决方案,助力企业产品升级

随着制造业升级加速、高端产品对可靠性要求提升及全球市场对质量标准的严格化,高可靠性测试设备已从特定行业需求逐步成为电子、汽车、航空航天等领域的必备工具,2025 年市场规模预计持续增长。但市场扩张也带来厂商…

八字手链人物传记计划——旭

写在前面1542 字 | 朋友 | 感触 | 生活细节 | 经历 | 生活灵珍琴懿,骆旭泽予。 正文我与旭已经四年没有联系过了。自初中以后,他似乎消失了一般。后面听人说,他去学了医。我很难想象,那个憨厚老实的一个胖胖孩子,…

详细介绍:c# datagridview添加list内容

pre { white-space: pre !important; word-wrap: normal !important; overflow-x: auto !important; display: block !important; font-family: "Consolas", "Monaco", "Courier New", …

20232309 2025-2026-1 《网络与系统攻防技术》实验一实验报告

1.实验内容 1.1学习内容缓冲区漏洞的概念,发展历程,经典案例 缓冲区溢出的基本知识gdb的基本操作:break、step、stepi、continue等 基本汇编指令:push、pop、ret、call等 栈结构:环境变量/参数和个数以及主函数和…

亚马逊发布基于Linux的Vega OS电视系统,禁止侧载应用

亚马逊正式推出基于Linux的Vega OS电视操作系统,取代基于Android的Fire OS。新系统仅支持亚马逊应用商店,禁止侧载应用,性能更高效但内存要求更低,目前仅在新款Fire TV 4K Select上提供。亚马逊发布基于Linux的Veg…