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

P2071 座位安排

这道题目是一个典型的二分图最大匹配问题。

题目分析

题目的核心在于“每一排可以坐两个人”,而每个人有两个心仪的排数。如果我们将“人”看作二分图左侧的顶点,将“排数”看作右侧的顶点,那么这道题的要求就是寻找最大匹配。

由于每一排能坐两个人的限制,我们可以通过一个小技巧将其转化为标准的二分图匹配:

  • 拆分节点:将每一排座位拆分为两个独立的“座位点”。例如,第 \(i\) 排可以拆分为 \(i\)\(i + N\) 两个点。
  • 建立连边:如果第 \(j\) 个人想坐第 \(i\) 排,我们就从人 \(j\) 向座位点 \(i\) 和座位点 \(i + N\) 各连一条边。
  • 求解:对这个拥有 \(2N\) 个人的点和 \(2N\) 个座位的点的二分图,运行匈牙利算法(Hungarian Algorithm)即可。

C++ 代码实现

这里使用匈牙利算法(DFS 实现),逻辑清晰且易于通过。

#include <iostream>
#include <vector>
#include <cstring>using namespace std;const int MAXN = 4005; // 2N 的最大值是 4000
vector<int> adj[MAXN]; // 邻接表,存储每个人想坐的排数
int match[MAXN];       // match[i] 表示第 i 个座位点匹配的人的编号
bool vis[MAXN];        // 标记在当前 DFS 中该座位点是否被访问过
int n;// 匈牙利算法的 DFS 核心过程
bool dfs(int u) {// 遍历这个人想坐的每一排for (int row : adj[u]) {// 每一排有两个座位点:row 和 row + nint seats[2] = {row, row + n};for (int i = 0; i < 2; ++i) {int v = seats[i];if (!vis[v]) {vis[v] = true;// 如果当前座位点没被占用,或者占用它的人可以换个位置if (match[v] == 0 || dfs(match[v])) {match[v] = u;return true;}}}}return false;
}int main() {ios::sync_with_stdio(false);cin.tie(0);cin >> n;// 输入 2N 个人的愿望for (int i = 1; i <= 2 * n; ++i) {int r1, r2;cin >> r1 >> r2;adj[i].push_back(r1);adj[i].push_back(r2);}int result = 0;// 对每一个人尝试进行匹配for (int i = 1; i <= 2 * n; ++i) {memset(vis, false, sizeof(vis));if (dfs(i)) {result++;}}cout << result << endl;return 0;
}

代码解析

  1. 数据结构
    • adj[i] 存储第 \(i\) 个人的两个心仪排数。
    • match[v] 记录第 \(v\) 个座位(注意这里座位编号是 \(1\)\(2N\))当前坐的是哪个人。
  2. 拆分技巧
    • dfs 函数中,对于输入的排数 row,我们尝试匹配座位 row 和座位 row + n。这等价于将一排拆成两个坑位。
  3. 复杂度分析
    • 时间复杂度:匈牙利算法的最坏复杂度为 \(O(V \cdot E)\)。本题中 \(V = 2N\),每个人的边数 \(E\) 实际上只有 \(4\) 条(连向两个排,每排两个座),所以总复杂度约为 \(O(2N \times 4)\),即 \(O(N)\) 级别。即使算上 memset 的开销,对于 \(N=2000\) 的规模也绰绰有余。
    • 空间复杂度:主要消耗在邻接表和 match 数组,为 \(O(N)\)

注意事项

  • 本题数据规模 \(N=2000\),总人数 \(2N=4000\),数组大小务必开够。
  • 使用 ios::sync_with_stdio(false) 可以加速输入输出,防止在大规模数据下超时。
http://www.jsqmd.com/news/432730/

相关文章:

  • 防泄密软件有哪些?全球六大防泄密软件推荐(2026最新排行榜)
  • 269_尚硅谷_全局互斥锁解决资源竞争
  • 2026年防静电椅厂家推荐排行榜:电子厂/PU/洁净室/半导体厂/无尘车间/实验室防静电椅与圆凳,专业防静电解决方案精选 - 品牌企业推荐师(官方)
  • 第三方图标库
  • 2026年环保设备厂家推荐排行榜:洒水车/洗车机/雾炮机/扫地机/降尘设备等源头工厂实力解析 - 品牌企业推荐师(官方)
  • 2026新材料行业工业烤箱优质厂家推荐:热风循环烘箱/精密烤箱厂家/精密高温试验箱/紫外线老化试验箱/选择指南 - 优质品牌商家
  • 2026专家访谈服务优质机构推荐指南聚焦专业交付 - 优质品牌商家
  • 2026四川工业园幕墙玻璃改开窗优质服务推荐 - 优质品牌商家
  • 告别“人肉守夜”:美团核销接口如何帮自助KTV解锁24小时真无人营业?
  • RAG深度学习指南
  • 小微KTV的“入场券”:解读美团核销门槛,小商家如何撬动平台亿级曝光?
  • 【收藏必备】Skills vs Agent全解析:程序员如何用Skills解放双手,提升开发效率
  • 逆向投资的成功案例分析
  • ANSYS许可证使用的周期性特征分析与应用
  • 收藏必备!大模型辅助开发的极简实践:文档驱动,自然演进
  • OpenCode-AI使用教程
  • SolidEdge用户使用习惯与功能模块偏好分析报告
  • AI Agent核心技术与实践:2026年AI开发新趋势,收藏学习必备
  • 从战略高度规划ANSYS仿真软件许可证资产
  • 2026/3/3课堂小测 从 B站 评论采集到 Hive 数据清洗,再同步到 MySQL:完整大数据流程
  • 2026环境试验设备推荐榜 精准适配电子制造制程 - 优质品牌商家
  • EasyDSS:轻量化视频直播点播+视频会议云平台,解锁企业视频应用开发新模式
  • 2024年最值得关注的10个AI代码生成项目
  • 2026年搬运车厂家实力推荐榜:遥控/电动/重型/防爆搬运车,无轨转向与地坪搬运车专业品牌深度解析 - 品牌企业推荐师(官方)
  • Tarjan算法
  • UniApp开发应用多平台上架全流程:H5小程序iOS和Android
  • 2026年 无机纤维厂家推荐排行榜:硬质/外墙/矿物/超细无机纤维棉,专业隔音材料源头实力解析 - 品牌企业推荐师(官方)
  • 2026年 沙盘模型厂家推荐排行榜:电子数字沙盘,地形地貌沙盘,新能源与氢能源沙盘,工业机械与建筑沙盘,智慧农业与城市规划沙盘模型公司精选 - 品牌企业推荐师(官方)
  • UniApp打包iOS应用并通过审核,代码混淆的挑战与解决方案
  • 【服务器数据恢复】基于UFS2与VMFS多层结构解析虚拟机数据恢复案例