当前位置: 首页 > news >正文

Gale-Ryser 定理与二分图度数序列匹配

1. 定理简介

例题

Gale-Ryser 定理是图论中的一个经典定理,用于判定:给定两组度数要求,是否存在一个满足这些要求的“简单二分图”(即左右两边的顶点之间最多只能连一条边)。

在本题中,问题被完美映射为构建简单二分图:

  • 左部节点\(M\) 本书,节点度数为 \(R_j\)(每本书需要被看 \(R_j\) 次)。

  • 右部节点\(N\) 天,节点最大度数为 \(L_i\)(每天最多看 \(L_i\) 本书)。

  • 边的限制:同一天同一本书只能看一次(简单二分图没有重边)。


2. 核心概念:共轭序列 (Conjugate Sequence)

为了应用定理,我们需要理解如何将容量序列转化。

假设每天的容量序列 \(L\) 降序排列后画成砖块(Ferrers 图),共轭序列 \(L^*\) 就是将这个图形“竖着看”(按列统计)得到的序列。

  • 物理意义\(L^*_k\) 表示 “容量至少为 \(k\) 的天数总共有多少天”

  • 代码实现:对 \(L\) 升序排序后,L.end() - lower_bound(L.begin(), L.end(), k) 就是在以 \(O(\log N)\) 的极快速度求出 \(L^*_k\) 的值。


3. 判定条件 (Gale-Ryser Condition)

将需求序列 \(R\) 降序排列(优先满足需求最大的书)。定理指出,存在合法排班方案的充要条件是:

对于任意的 \(k \in [1, M]\)前缀和均满足以下不等式:

\[\sum_{j=1}^{k} R_j \le \sum_{j=1}^{k} L^*_j \]

(注:如果要求二分图的度数刚好严格等于 \(L\),则最后还需要加上总和相等 \(\sum R = \sum L\) 的条件。本题天数容量是上限,所以只需满足不等式即可。)


4. 底层逻辑:为什么比较前缀和?

假设我们要强行满足需求量最大的前 \(k\) 本书。

对于这 \(k\) 本书,系统能提供的理论最大合法容量是多少?

  • 如果某天容量充足(\(L_i \ge k\)),因为一天一本书只能看一次,这天最多只能给这 \(k\) 本书提供 \(k\) 个名额

  • 如果某天容量不足(\(L_i < k\)),这天即使全用来排这 \(k\) 本书,也只能提供 \(L_i\) 个名额

将所有天数能提供的最大名额加起来 \(\sum \min(L_i, k)\),在数学上刚好等于共轭序列 \(L^*\) 的前 \(k\) 项之和

如果需求总和超出了这个系统能提供的物理极限(即 \(\sum R > \sum L^*\)),则必然无解。


5. 算法模板抽象

解决此类“判断多对多容量与需求匹配”的问题,只需三步,时间复杂度 \(O(M \log N + M \log M)\)

// 1. 容量 L 升序排序 (为了方便二分查找)
sort(L.begin(), L.end());// 2. 需求 R 降序排序 (贪心优先满足大需求)
sort(R.begin(), R.end(), greater<int>());long long sum_R = 0; // 需求前缀和
long long sum_C = 0; // 容量共轭序列前缀和// 3. 逐项验证前缀和
for (int k = 0; k < M; k++) {sum_R += R[k];// 巧妙求出共轭序列的第 k+1 项:容量 >= k+1 的天数long long current_L_star = L.end() - lower_bound(L.begin(), L.end(), k + 1);sum_C += current_L_star;// 一旦需求超过最大理论容量,立刻判定无解if (sum_R > sum_C) {return false; }
}
return true; // 所有前缀均满足,必定有解
http://www.jsqmd.com/news/524546/

相关文章:

  • 2026年最好用的网盘资源搜索引擎推荐:来搜盘实测体验
  • ArcGIS小白必看:3个隐藏技巧让你的天地图区位图秒变专业(附成都案例数据)
  • 计算机毕业设计springboot基于的考研学习平台 基于Spring Boot框架的考研备考资源整合与在线模拟测试系统开发 Spring Boot驱动的研究生考试个性化学习路径与知识社区系统构建
  • 手把手教你用Dify的Rookie插件连接MySQL,给AI装上‘数据透视’的眼睛(Spring Boot做数据源)
  • AFL实战:用《X战警》测试视频挖掘FFmpeg漏洞的趣味实验
  • 西门子1200PLC博途3种自动流程程序写法 a5PLC自动流程程序模版 西门子程序自动流程标准模版
  • 2026年 双桶/多桶磁力研磨机厂家推荐榜单:高效去毛刺与精密抛光,工业级表面处理设备实力品牌深度解析 - 品牌企业推荐师(官方)
  • openclaw 本地基础安装配置
  • 5分钟搞定Jinja2模板继承:从零搭建可复用的HTML骨架
  • OpenCV 里藏着 7 个经典算法——你用的每个轮廓函数背后的数学和工程优化
  • 浅谈密码学(一)基础知识
  • 2026成都白蚁防治优质品牌推荐榜:成都白蚁服务单位、成都白蚁治理、成都白蚁消杀、成都白蚁防治中心、成都白蚁防治办公室选择指南 - 优质品牌商家
  • 别再当‘黑箱’受害者!用MATLAB给LSTM预测模型做个‘CT’:SHAP可解释性实战
  • 利用反函数求解一类无穷级数
  • 保姆级教程:在RK3588上部署多模型YOLOv5,用QuickRun实现25FPS高并发推理
  • 机器学习入门:如何用Python实现概念学习(Concept Learning)的完整流程
  • 20251229 2025-2026-2 《Python程序设计》实验1报告
  • 常见的数据泄露风险与保密与防范策略,一文详解!
  • 告别C盘!Jupyter Notebook工作目录迁移与多环境路径管理实战
  • 灰狼算法实现部分遮阴下的MPPT跟踪探索
  • 上海正规工商注册财务优质机构推荐指南:上海注册文化创意公司/上海注册新能源公司/上海注册生物医药公司/上海注册电子商务公司/选择指南 - 优质品牌商家
  • 青龙面板抓包实战:VMOS虚拟机与小黄鸟完美配合指南
  • MONAI实战:5分钟搞定医学影像分割的增强版UNet配置
  • 架构实战:机房轮式巡检机器人梯控的非侵入式边缘解耦设计
  • 实验常用linux指令
  • 【三载笔耕逐光,笃行致远赴新程】我的技术博客三周年记
  • 游戏玩家必看:msvcp140.dll丢失的5种修复方法(附Visual C++ 2015-2022安装包下载)
  • 告别手动通知!用Python+Watchdog为你的Emby Server打造一个自动影片推送机器人
  • Windows程序静默运行解决方案:RunHiddenConsole技术原理与企业级实践
  • 手把手教你排查Windows10时间同步问题:从服务状态到服务器切换全流程