使用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.pswp.cn/diannao/41233.shtml
繁體地址,請注明出處:http://hk.pswp.cn/diannao/41233.shtml
英文地址,請注明出處:http://en.pswp.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;各種預算一再壓縮…