使用C++实现求职者和部门之间最大配对

某人力资源公司收到了m个合格的求职者的简历,要将他们分发给n个部门,每份简历符合一个或者几个部门的要求,但是每个人的简历最多送给k个部门,每个部门最多可以接受d份简历,如何实现求职者和部门之间的最大配对。使用了最大流算法来解决问题,其中将每份简历最多送给k个部门和每个部门最多接受d份简历的问题通过构建一个流网络来解决。我们使用Ford-Fulkerson算法来实现这个最大流问题的解决。

#include <iostream>  // 包含输入输出流库
#include <vector>    // 包含vector容器库
#include <cstring>   // 包含C风格字符串处理函数
#include <queue>     // 包含队列数据结构
#include <algorithm> // 包含常用算法函数,如min
using namespace std; // 使用标准命名空间class MaxFlow { // 定义最大流类struct Edge { // 定义边结构int to, capacity, flow, rev; // 目标节点、容量、流量、反向边索引};int n; // 节点数vector<vector<Edge>> adj; // 邻接表表示图vector<int> level; // 节点层次vector<int> ptr; // 当前弧指针bool bfs(int s, int t) { // 宽度优先搜索构建层次图queue<int> q; // 创建队列level.assign(n, -1); // 初始化所有节点层次为-1level[s] = 0; // 源点层次为0q.push(s); // 源点入队while (!q.empty()) { // 当队列非空时int u = q.front(); // 取出队首元素q.pop(); // 队首元素出队for (const Edge& e : adj[u]) { // 遍历u的所有邻边if (level[e.to] == -1 && e.flow < e.capacity) { // 如果目标节点未访问且边未满level[e.to] = level[u] + 1; // 设置目标节点层次q.push(e.to); // 目标节点入队}}}return level[t] != -1; // 返回是否存在增广路径}int dfs(int u, int t, int pushed) { // 深度优先搜索寻找增广路径if (pushed == 0 || u == t) return pushed; // 如果到达终点或没有可增广的流量,返回for (int& cid = ptr[u]; cid < adj[u].size(); ++cid) { // 遍历u的所有邻边Edge& e = adj[u][cid]; // 获取当前边int v = e.to; // 获取目标节点if (level[u] + 1 == level[v] && e.flow < e.capacity) { // 如果是下一层且边未满int tr = dfs(v, t, min(pushed, e.capacity - e.flow)); // 递归寻找增广路径if (tr == 0) continue; // 如果没有找到增广路径,继续下一条边e.flow += tr; // 正向边增加流量adj[v][e.rev].flow -= tr; // 反向边减少流量return tr; // 返回增广流量}}return 0; // 没有找到增广路径,返回0}public:MaxFlow(int n) : n(n), adj(n), level(n), ptr(n) {} // 构造函数初始化void addEdge(int u, int v, int capacity) { // 添加边Edge a = {v, capacity, 0, adj[v].size()}; // 创建正向边Edge b = {u, 0, 0, adj[u].size()}; // 创建反向边adj[u].push_back(a); // 添加正向边adj[v].push_back(b); // 添加反向边}int getMaxFlow(int s, int t) { // 计算最大流int maxFlow = 0; // 初始化最大流为0while (bfs(s, t)) { // 当存在增广路径时ptr.assign(n, 0); // 重置当前弧指针while (int flow = dfs(s, t, INT_MAX)) { // 寻找增广路径maxFlow += flow; // 累加增广流量}}return maxFlow; // 返回最大流}
};int main() {int m, n, k, d; // 定义变量:求职者数量、部门数量、最多投递数、最多接受数cout << "请输入求职者数量 m: "; // 提示输入求职者数量cin >> m; // 输入求职者数量cout << "请输入部门数量 n: "; // 提示输入部门数量cin >> n; // 输入部门数量cout << "请输入每个求职者最多投递的部门数量 k: "; // 提示输入最多投递数cin >> k; // 输入最多投递数cout << "请输入每个部门最多接受的简历数量 d: "; // 提示输入最多接受数cin >> d; // 输入最多接受数vector<vector<int>> preferences(m); // 创建二维vector存储求职者偏好cout << "请输入每个求职者的部门偏好(每行以空格分隔的部门编号,使用-1结束):\n"; // 提示输入偏好for (int i = 0; i < m; ++i) { // 遍历每个求职者int dept; // 临时存储部门编号while (cin >> dept && dept != -1) { // 输入部门编号直到-1preferences[i].push_back(dept); // 将部门编号添加到偏好列表}}int source = 0; // 源点编号int sink = m + n + 1; // 汇点编号MaxFlow maxFlow(m + n + 2); // 创建最大流对象for (int i = 0; i < m; ++i) { // 遍历每个求职者maxFlow.addEdge(source, i + 1, k); // 添加源点到求职者的边}for (int i = 0; i < n; ++i) { // 遍历每个部门maxFlow.addEdge(m + 1 + i, sink, d); // 添加部门到汇点的边}for (int i = 0; i < m; ++i) { // 遍历每个求职者for (int dept : preferences[i]) { // 遍历求职者的偏好部门maxFlow.addEdge(i + 1, m + 1 + dept, 1); // 添加求职者到部门的边}}int maxMatching = maxFlow.getMaxFlow(source, sink); // 计算最大流cout << "最大配对数量: " << maxMatching << endl; // 输出最大配对数量return 0; // 程序正常结束
}
  • MaxFlow类实现了最大流算法,包括构造函数、添加边的方法和计算最大流的方法。
  • bfs方法用于构建层次图,dfs方法用于寻找增广路径。
  • main函数读取输入,包括求职者数量、部门数量、每个求职者最多投递的部门数量和每个部门最多接受的简历数量。
  • 使用邻接表存储图,并添加相应的边。
  • 最后调用getMaxFlow方法计算并输出最大配对数量。

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

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

相关文章

废水除铱,铱吸附树脂

废水除铱是环境保护和资源回收的重要任务之一。由于铱是贵金属之一&#xff0c;具有极高的经济价值&#xff0c;因此开发高效的废水除铱技术具有重要意义。以下是一些建议的废水除铱方法&#xff1a; 1. 沉淀法&#xff1a;向废水中添加适量的沉淀剂&#xff0c;如硫酸钠、氯…

redis学习(003 数据结构和通用命令)

黑马程序员Redis入门到实战教程&#xff0c;深度透析redis底层原理redis分布式锁企业解决方案黑马点评实战项目 总时长 42:48:00 共175P 此文章包含第8p-第p9的内容 文章目录 数据结构通用命令keys命令del命令exists命令expire命令ttl命令 数据结构 通用命令 help generic …

Visual Studio编译优化选项

目录 /O1 和 /O2 /Ox 内联函数 虚函数优化 代码重排 循环优化 链接时间优化 代码分割 数学优化 其他优化选项 在Visual Studio中&#xff0c;编译优化选项是用于提高程序性能的重要工具。编译器提供了多种优化级别和选项&#xff0c;可以根据不同的需要进行选择。 在…

光伏仿真系统不可忽视的功能:建模与仿真!

光伏仿真系统具备多种功能&#xff0c;能够支持对光伏发电系统进行深入研究和优化。为什么说建模与仿真功能是最不可忽视的呢&#xff1f;我们先来看看建模功能。 光伏仿真系统可以通过光伏插件或扩展程序&#xff0c;创建精确的光伏组件模型&#xff0c;包括光伏板、支架、逆变…

python输出个人自我介绍

需求 使用input()函数从键盘输入姓名、年龄&#xff0c;座右铭&#xff0c;并使用print()函数输出到控制台 nameinput(请输入您的姓名&#xff1a;) ageinput(请输入您的年龄&#xff1a;) mottoinput(请输入您的座右铭&#xff1a;) print(------------自我介绍------------…

5G 连接存在漏洞,移动设备易被绕过或受到 DoS 攻击

无线服务提供商优先考虑正常运行时间和延迟时间&#xff0c;有时以牺牲安全性为代价&#xff0c;允许攻击者利用这一漏洞窃取数据&#xff0c;甚至更糟。 由于 5G 技术存在漏洞&#xff0c;移动设备面临着数据被肆意窃取和拒绝服务的风险。 在即将于拉斯维加斯举行的「黑帽 2…

Pandas 入门 15 题

Pandas 入门 15 题 1. 相关知识点1.1 修改DataFrame列名1.2 获取行列数1.3 显示前n行1.4 条件数据选取值1.5 创建新列1.6 删去重复的行1.7 删除空值的数据1.9 修改列名1.10 修改数据类型1.11 填充缺失值1.12 数据上下合并1.13 pivot_table透视表的使用1.14 melt透视表的使用1.1…

C#桌面应用开发:番茄定时器

C#桌面应用开发&#xff1a;番茄定时器 1、环境搭建和工程创建&#xff1a; 步骤一&#xff1a;安装visual studio2022 步骤二&#xff1a;新建工程 2、制作窗体部件 *踩过的坑&#xff1a; &#xff08;1&#xff09;找不到工具箱控件&#xff0c;现象如下&#xff1a;…

软件测试之接口自动化测试实战(完整版)

&#x1f345; 视频学习&#xff1a;文末有免费的配套视频可观看 &#x1f345; 点击文末小卡片&#xff0c;免费获取软件测试全套资料&#xff0c;资料在手&#xff0c;涨薪更快 自从看到阿里云性能测试 PTS 接口测试开启免费公测&#xff0c;就想着跟大家分享交流一下如何实现…

通义灵码入选 2024 世界人工智能大会最高荣誉「镇馆之宝」

7 月 4 日&#xff0c;2024 上海世界人工智能大会正式开幕&#xff0c;并揭晓了今年的「镇馆之宝」名单&#xff0c;通义灵码入选&#xff0c;是首个入围该名单的 AI 编程助手。 镇馆之宝是世界人工智能大会展览的最高荣誉&#xff0c;从科技含量、市场前景、创新性以及社会经济…

OV通配符证书用于什么单位

OV&#xff08;Organization Validation&#xff09;通配符SSL证书是一种专门为组织或企业设计的SSL证书类型&#xff0c;它不仅提供了标准的SSL加密功能&#xff0c;还包含了对组织身份的验证。这种证书非常适合以下几种类型的单位使用&#xff1a; 企业级网站&#xff1a; …

【稳定检索/投稿优惠】2024年教育、人文发展与艺术国际会议(EHDA 2024)

2024 International Conference on Education, Humanities Development and Arts 2024年教育、人文发展与艺术国际会议 【会议信息】 会议简称&#xff1a;EHDA 2024 大会时间&#xff1a;点击查看 截稿时间&#xff1a;点击查看 大会地点&#xff1a;中国北京 会议官网&#…

Linux系统中卸载GitLab

在Linux系统中卸载GitLab&#xff0c;主要可以通过包管理器&#xff08;如apt、yum、rpm等&#xff09;来实现&#xff0c;但具体步骤可能会因GitLab的安装方式&#xff08;如使用包管理器安装、从源代码安装、使用Docker等&#xff09;和Linux发行版的不同而有所差异。以下是一…

直饮水也要烧开饮用吗?

某天上班&#xff0c;同事跟我说他的爸爸喝瓶装水都要烧开了后再喝。 这种行为震惊了小编。 好像很多上一辈的人有种执念&#xff0c;那就是水一定要烧开了喝。 不仅是因为习惯&#xff0c;也是他们的观念已经根深蒂固&#xff0c;认为烧开后的水喝起来才健康。 其实水不一…

华火电燃喷火单灶再荣获中国质量认证中心 CQC 权威证书,引领行业新高度

近日&#xff0c;华火传来了一则令整个行业瞩目的重大喜讯&#xff1a;其电燃喷火单灶“再度”成功荣获中国质量认证中心&#xff08;CQC&#xff09;权威证书。这一里重大程碑式的成就&#xff0c;不仅是对华火产品卓越品质的高度认可&#xff0c;更是华火在品牌发展道路上的一…

【launch语法记录】—— ros中launch文件中的常见的语法参数的介绍

提示&#xff1a;文章写完后&#xff0c;目录可以自动生成&#xff0c;如何生成可参考右边的帮助文档 文章目录 前言(1)<launch>节点(2)<node> 节点(3)<param> 标签(4)<rosparam> 标签(5)<include> 标签(6)<arg> 标签(7)<remap> 标签…

uni-app使用ucharts地图,自定义Tooltip鼠标悬浮显示内容并且根据@getIndex点击事件获取点击的地区下标和地区名

项目场景&#xff1a; uni-app使用ucharts地图,自定义Tooltip鼠标悬浮显示内容并且根据getIndex点击事件获取点击的地区下标和地区名 例如&#xff1a; 问题描述 官方给的文档有限&#xff0c;需要自己下载地图json数据然后自己渲染和编写鼠标悬浮显示内容以及获取点击地址…

go语言day08 泛型 自定义错误处理 go关键字:协程

泛型&#xff1a; 抛错误异常 实现error接口类型 用java语言解释的话&#xff0c;实现类需要重写error类型的抽象方法Error().这样就可以自定义异常处理。 回到go语言&#xff0c;在Error()方法中用*argError 这样一个指针类来充当error接口的实现类。 在f2()方法中定义返回值…

荣耀电脑误删U盘文件?别慌,这里有找回方法

荣耀电脑误删U盘文件怎么找回&#xff1f;在日常工作和生活中&#xff0c;U盘是我们存储和传输数据的重要工具之一。然而&#xff0c;在使用荣耀电脑时&#xff0c;如果不小心误删了U盘中的文件&#xff0c;可能会给我们带来不小的困扰。但是&#xff0c;别慌&#xff01;本文将…

免费的才是王道,有哪些业务类、合同类的管理系统能够让我们受益终身?

看了题主提问&#xff0c;深感当今中小企业生存环境的艰辛。一方面是现在的智能生活软件有了很深的普及和使用习惯&#xff0c;另外一个是行业竞争压力越来越大不变不行。 但是生存不易&#xff0c;且行且珍惜&#xff0c;每一份钱都要用在刀刃上&#xff0c;各种预算一再压缩…