原理:

  1. 所有男性按照好感的高低向对应女性求婚
  2. 每个女性在所有的向她发出求婚的男性和其丈夫(如果暂无丈夫则不做比较)选择一个最喜欢的,如果这个最喜欢的是当前的丈夫,则婚姻关系不变,否则与当前丈夫离婚,并与向她发出求婚请求的男性结婚
  3. 在每个女性处理完后,统计是否还有男性单身(被离婚的将加入单身行列),如果有,则重复上述过程,否则结束

注意:每个单身男性会依次按照其对每个女性的好感的从大到小向对应女性求婚,如果求婚过该女性,无论是否当前求婚被接受,后续都将不再向该女性求婚。

由于每个男生最多向每个女生求婚一次,因此最多 n 2 n^2 n2 次后,算法将完成,其中 n n n 是男生和女生的数量。
时间复杂度: O ( n 2 ) O(n^2) O(n2)

代码:

//
// Created by solego on 2022/10/16.
//#include <iostream>
#include <algorithm>
#include <vector>
#include <unordered_map>
using namespace std;const int N = 4;
vector<string> girl = {"Ada","Becky","Cindy","Diana",
};vector<string> boy = {"Alex","Chris","David","Bob",
};unordered_map<string, int> girl_id;
unordered_map<string, int> boy_id;vector<vector<string>> boy_to_girl = {{"Ada", "Diana", "Cindy", "Becky"},{"Becky", "Diana", "Cindy", "Ada"},{"Cindy", "Ada", "Becky", "Diana"},{"Ada", "Becky", "Cindy", "Diana"},
};vector<vector<string>> girl_to_boy = {{"Chris", "Alex", "Bob", "David"},{"Alex", "David", "Chris", "Bob"},{"Bob", "David", "Chris", "Alex"},{"David", "Bob", "Alex", "Chris"},
};int get_priority(const string& girl_name, const string& boy_name) {int g_id = girl_id[girl_name];for (int i = 0; i < girl_to_boy[g_id].size(); ++i) {if (boy_name == girl_to_boy[g_id][i])return i;}return N;
}void init() {for (int i = 0; i < girl.size(); ++i) {girl_id[girl[i]] = i;}for (int i = 0; i < boy.size(); ++i) {boy_id[boy[i]] = i;}
}void test() {vector<bool> matched_boy(N, false);vector<string> girl_matched_boy(N, "");auto b2g = boy_to_girl;for (auto& u: b2g) reverse(u.begin(), u.end());// 每一轮,将每个还未匹配的男生,尝试匹配其当前还未匹配过的,优先级最高的女生int sum = 0;while (sum < N) {vector<vector<string>> girl_new_boy(N, vector<string>());for (int i = 0; i < N; ++i) {if (!matched_boy[i]) {string g_name = b2g[i].back();b2g[i].pop_back();int g_id = girl_id[g_name];girl_new_boy[g_id].push_back(boy[i]);}}for (int i = 0; i < N; ++i) {if (girl_new_boy.empty()) continue ;for (const auto& b_name: girl_new_boy[i]) {if (girl_matched_boy[i].empty()) {matched_boy[i] = true;girl_matched_boy[i] = b_name;sum += 1;} else {if (get_priority(girl[i], b_name) < get_priority(girl[i], girl_matched_boy[i])) {matched_boy[ boy_id[b_name] ] = true;matched_boy[ boy_id[girl_matched_boy[i]] ] = false;girl_matched_boy[i] = b_name;// 这里不需要更新sum,因为总共匹配的sum数不变}}}}}for (int i = 0; i < N; ++i) {cout << girl_matched_boy[i] << " get married to " << girl[i] << ".\n";}
}int main()
{init();test();return 0;
}

输出:

Alex get married to Ada.
David get married to Becky.
Bob get married to Cindy.
Chris get married to Diana.

【Gale Shapley 婚姻稳定匹配算法实现】相关推荐

  1. 算法 | 盖尔-沙普利(Gale-Shapley)婚姻稳定匹配算法

    盖尔-沙普利[Gale-Shapley]婚姻稳定匹配算法 1 背景说明 2 原理及思路 2.1 问题的描述 2.2 盖尔-沙普利算法的思路 3 程序实现 4 结果分析 5 后记 概要: 本文将要介绍的 ...

  2. 稳定匹配算法python实现

    所谓稳定匹配算法,就是如果男人想出轨,美女女对他没有一点点性趣,并且爱他的女人比老婆丑十万八千里 反之女人亦然.     用数学语言来讲就是,博弈的各方达到纳什均衡点.     '吕布','刘备',' ...

  3. G-S稳定匹配算法详解

    G-S稳定匹配算法详解 GS算法是解决稳定匹配问题(stable matching)的一个优秀的算法. 下面以男女配对的例子来介绍稳定匹配问题并阐述GS算法的具体步骤. GS算法,全称Gale-Sha ...

  4. 稳定婚姻问题:Gale–Shapley算法

    (一)问题的引出 在组合数学.经济学.计算机科学中,稳定婚姻问题(英语:stable marriage problem,简称SMP)又称为稳定配对问题(stable matching problem) ...

  5. 婚姻匹配问题---盖尔-沙普利(Gale-Shapley)稳定匹配算法

    问题导入 一共有N位男士和N位女士,每个人都要选择结婚对象.如果有两对夫妻M1F2,M2F1.M1心目中更喜欢F1,但是他和F2结婚了,M2心目中更喜欢F2,但是命运却让他和F1结婚了,显然这样的婚姻 ...

  6. 匹配算法——相亲男女匹配

    时间:20210928 背景:有个相亲活动,需要暗地里给男女进行匹配,毕竟明面上直接说不喜欢哪个异性总是尴尬的.匹配的话,方法众多,并不能让每个人都满意,根据各自的意向,总能计算整体意向都不错的. 太 ...

  7. 软件工程实践2017 结队项目——第二次作业

    作业链接 031502333 GITHUB LINK 前言 近期比较倾向于使用Go语言写小工具,所以在看到作业不限制编程语言时就决定使用Go作为开发语言.而由于Go的诸多优秀特性,使得编写代码效率极高 ...

  8. hdu1435 稳定婚姻问题

    题意: Stable Match Special Judge Problem Description Network 公司的BOSS 说现在他们公司建立的信号发射站和接收站经常出现信号发送接收不稳定的 ...

  9. hdu1914 稳定婚姻问题

               稳定婚姻问题就是给你n个男的,n个女的,然后给你每个男生中女生的排名,和女生心目中男生的排名,然后让你匹配成n对,使婚姻稳定,假如a和b匹配,c和d匹配,如果a认为d比b好,同时 ...

最新文章

  1. XamarinAndroid组件教程设置动画的设置插值器
  2. .NET 事件模型教程(一)
  3. Docker系列教程01-Centos7安装新版Docker教程(10步)
  4. php获取表单信息的代码_PHP获取HTML文件名表单数据等
  5. python逆序数怎么求_怎么算逆序数?急~~~!!!
  6. 由浅入深CAS,小白也能与BAT面试官对线
  7. GNU Emacs的终极扩展管理工具 — el-get
  8. python ftp编程_Python编程-FTP
  9. BUUCTF-Crypto-rabbit+篱笆墙上的影子(栅栏密码)+RSA题解
  10. 8项引导技能在Scrum中的应用
  11. 历年研究生数学建模优秀论文汇总
  12. windos无法对计算机进行,电脑提示windows无法完成格式化如何解决
  13. 成功人士成功秘诀的调查报告,拥有梦想至关重要
  14. MySQL5.7修改密码问题解决方案
  15. Go 语言运行时环境变量快速
  16. IAR for ARM系列教程(四)_菜单(Ⅱ)
  17. STM32基于软件模拟IIC进行AHT21B温湿度采集
  18. 好用的fuzz字典以及fuzz字典生成工具
  19. 达内推出内部员工购房计划最高可贷50万
  20. 图片英文翻译成中文转换器-中文翻译英文软件

热门文章

  1. c语言图形学扫描线填充算法,《计算机图形学》OpenGL实现扫描线填充算法
  2. UR机械臂学习(4):UR机械臂仿真
  3. 【STM32H7】第4章 ThreadX USBX协议栈基础知识
  4. 10oa协同办公系统如何在大数据时代脱颖而出
  5. 国民MCU 微型打印机解决方案
  6. 手机在网状态和手机在网时长有哪些不同?
  7. 3Dmax和Maya孰优孰劣?初学者入门该如何选择?
  8. PLS-00410: duplicate fields in RECORD,TABLE or argument list are not permitted
  9. Transformer--Attention is All You Need (推荐--非常详细)
  10. 设计已死? (ZT)