Stable Matching-稳定匹配问题【G-S算法,c++】

2023-10-27

Stable Matching-稳定匹配问题【G-S算法,c++】

题目描述:(Gale-Shapley算法)

Teenagers from the local high school have asked you to help them with the organization of next year’s Prom. The idea is to find a suitable date for everyone in the class in a fair and civilized way. So, they have organized a web site where all students, boys and girls, state their preferences among the class members, by ordering all the possible candidates. Your mission is to keep everyone as happy as possible. Assume that there are equal numbers of boys and girls.
当地高中的青少年要求您帮助他们组织明年的舞会。 想法是以公平文明的方式为班上的每个人找到合适的约会对象。 因此,他们组织了一个网站,所有学生,男孩和女孩,通过订购所有可能的候选人,在班级成员中陈述他们的偏好。 你的任务是让每个人都尽可能开心。 假设男孩和女孩的数量相等。

Given a set of preferences, set up the blind dates such that there are no other two people of opposite sex who would both rather have each other than their current partners. Since it was decided that the Prom was Ladies’ Choice, we want to produce the best possible choice for the girls.
给定一组偏好,设置相亲日期,使得没有其他两个异性比他们现在的伴侣更愿意拥有对方。 由于决定舞会是女士们的选择,我们希望为女孩们提供最好的选择。
Input:
Input consists of multiple test cases the first line of the input contains the number of test cases.
There is a blank line before each dataset.
The input for each dataset consists of a positive integer N, not greater than 1,000, indicating the number of couples in theclass. Next, there are N lines, each onecontaining the all the integers from 1 to N,ordered according to the girl’s preferences. Next, there are N lines, each one containing all the integers from 1 to N, ordered according to the boy’s preferences.
输入由多个测试用例组成
输入的第一行包含测试用例的数量。
每个数据集前有一个空行。
每个数据集的输入由一个不大于 1000 的正整数 N 组成,表示该类中的夫妻数量。 接下来,有N行,每行包含从1到N的所有整数,按照女孩的喜好排序。 接下来,有 N 行,每行包含从 1 到 N 的所有整数,按照男孩的喜好排序。
Output:
The output for each dataset consists of a sequence of N lines, where the i-th line containsthe number of the boy assigned to the i-th girl (from 1 to N).
Print a blank line between datasets.
每个数据集的输出由一系列 N 行组成,其中第 i 行包含分配给第 i 个女孩的男孩的编号(从 1 到 N)。
在数据集之间打印一个空行。
Sample Input:
1
5
1 2 3 5 4
5 2 4 3 1
3 5 1 2 4
3 4 2 1 5
4 5 1 2 3
2 5 4 1 3
3 2 4 1 5
1 2 4 3 5
4 1 2 5 3
5 3 2 4 1
Sample Output:
1
2
5
3
4

解题思路一:G-S算法(Gale-Shapley算法)

基本思想:以不断”求婚”的过程来逼近一个稳定匹配的状态
伪代码:(注意男生与女生的优先级,如果是女生先选,那么下列伪代码男女互换即可)

初始所有的m∈M和w∈W都是自由的
While 存在男人m是自由的且没有对每个女人都求过婚
	选择这样一个男人m
	令w是m的优先表中m还没有求过婚的排名最高的女人
	If    w是自由的    then
		(m,w)变成约会状态
	Else    w当前正在与m'约会
		If    w相较于m更爱m'    then
			m保持自由
		Else    w相较于m'更爱m
			(m,w)变成约会状态
			m'变成自由状态
		Endif
	Endif
Endwhile
输出已约会的集合S.

代码思想:首先创建两个二维数组记录男女的偏好,再创建两个一维数组记录男女目前的配偶(0代表自由状态)。
我们将这两个一维数组的第一个元素即:坐标为0的元素用来记录目前已匹配的人数。而将二维数组的每个一维数组坐标为0的元素记录对应男生和女生目前只能从第几号备胎开始选择。
即我们每次找到编号最小且未配偶的女生,然后从其备胎里面找下一位。若备胎未配偶那么直接配对。若备胎已配偶那么看该备胎是喜欢她还是喜欢前任。如果喜欢前任,就继续换下一个备胎。如果喜欢她就直接配对,前任自由。(总体就是这样一个思路)

c++代码:(需要注意输出格式和每次清空数组)
(大家尽量自己手敲一遍加深印象哦!)

#include<bits/stdc++.h>
using namespace std;
const int maxN=1009;
int woman[maxN]={0},man[maxN]={0};//woman[0]对应该女生只能从该号开始选
int manlist[maxN][maxN]={0},womanlist[maxN][maxN]={0};
bool lovemore(int m,int w,int n){
    for(int i=1;i<=n;++i)
        if(manlist[m][i]==w) return true;//更喜欢现在的
        else if(manlist[m][i]==man[m]) return false;//更喜欢之前的
    return false;
}
void stableMatching(int n){
    int m,w;
    while(woman[0]!=n){//woman[0]记录已经匹配的女生
        w=m=0;
        while(woman[++w]!=0);
        m=womanlist[w][++womanlist[w][0]];//[0]对应该女生只能从该号开始选
        if(man[m]){//如果该男生已经匹配了
            if(lovemore(m,w,n)){//更喜欢现在的
                woman[man[m]]=0;//之前喜欢该男生的女生自由
                woman[w]=m;//当前女生喜欢m号man
                man[m]=w;//该男生喜欢变为当前女生
            }else continue;//w继续找列表下一个
        }else{
            woman[w]=m;++woman[0];
            man[m]=w;++man[0];
        }
    }
    
}
void getprefer(int N){
    for(int i=1;i<=N;++i)
        for(int j=1;j<=N;++j)
            cin>>womanlist[i][j];
    for(int i=1;i<=N;++i)
        for(int j=1;j<=N;++j)
            cin>>manlist[i][j];
}
void output(int n){
    for(int i=1;i<=n;++i){
        cout<<woman[i]<<endl;
    }
}
int main(){
    int num,N;
    cin>>num;
    while(num--){
        cin>>N;
        getprefer(N);
        stableMatching(N);
        output(N);
        memset(man, 0, sizeof(man));
        memset(woman, 0, sizeof(woman));
        memset(manlist, 0, sizeof(manlist));
        memset(womanlist, 0, sizeof(womanlist));
        if(num>=1) cout<<endl;
        
    }
    return 0;
}

时间复杂度:O(n^2)
空间复杂度:O(n^2)
有关G-S算法想了解更多的参考下面的链接。
Reference:
https://blog.rulinxing.com/Stable%20Matching-%E7%A8%B3%E5%AE%9A%E5%8C%B9%E9%85%8D%E9%97%AE%E9%A2%98.html

本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)

Stable Matching-稳定匹配问题【G-S算法,c++】 的相关文章

  • 如何从字符串中提取子字符串直到遇到第二个空格?

    我有一个像这样的字符串 o1 1232 5467 1232 5467 1232 5467 1232 5467 1232 5467 1232 5467 如何仅提取 o1 1232 5467 要提取的字符数并不总是相同 因此 我只想提取直到遇到
  • 捕获 .aspx 和 .ascx 页面中的异常

    问题说明了一切 请看以下示例代码 ul li li ul
  • strlen() 编译时优化

    前几天我发现你可以找到编译时strlen使用这样的东西 template
  • Boost ASIO 串行写入十六进制值

    我正在使用 ubuntu 通过串行端口与设备进行通信 所有消息都必须是十六进制值 我已经在 Windows 环境中使用白蚁测试了通信设置 并得到了我期望的响应 但在使用 Boost asio 时我无法得到任何响应 以下是我设置串口的方法 b
  • 使用 C# 和 ASP.NET 在电子邮件附件中发送 SQL 报告

    我正在尝试使用 ASP NET 和 C 从 sql reportserver 2008 作为电子邮件附件发送报告 到目前为止我学会了如何获取 PDF 格式的报告 http weblogs asp net srkirkland archive
  • 如何向 Mono.ZeroConf 注册服务?

    我正在尝试测试 ZeroConf 示例http www mono project com Mono Zeroconf http www mono project com Mono Zeroconf 我正在运行 OpenSuse 11 和 M
  • 为什么这个 makefile 在“make clean”上执行目标

    这是我当前的 makefile CXX g CXXFLAGS Wall O3 LDFLAGS TARGET testcpp SRCS main cpp object cpp foo cpp OBJS SRCS cpp o DEPS SRCS
  • C# 根据当前日期传递日期时间值

    我正在尝试根据 sql server 中的两个日期获取记录 Select from table where CreatedDate between StartDate and EndDate我通过了5 12 2010 and 5 12 20
  • Libev,如何将参数传递给相关回调

    我陷入了 libev 中争论的境地 通常 libev 在类似的函数中接收包 接收回调 没关系 但是实际操作中 我们需要派遣一个亲戚 写回调 根据收到的包裹处理具体工作 例如 S RECV MSG pstRecvMsg S RECV MSG
  • 测量进程消耗的 CPU 时钟

    我用 C 语言编写了一个程序 它是作为研究结果创建的程序 我想计算程序消耗的确切 CPU 周期 精确的循环次数 知道我怎样才能找到它吗 The valgrind tool cachegrind valgrind tool cachegrin
  • LinkLabel 无下划线 - Compact Framework

    我正在使用 Microsoft Compact Framework 开发 Windows CE 应用程序 我必须使用 LinkLabel 它必须是白色且没有下划线 因此 在设计器中 我将字体颜色修改为白色 并在字体对话框中取消选中 下划线
  • C# 获取数据表中所有重复行的计数

    我通过运行存储过程来填充数据集 并且从数据集中填充数据表 DataSet RawDataSet DataAccessHelper RunProcedure storedprocedureName this will just return
  • MySQL 连接器 C++ 64 位在 Visual Studio 2012 中从源代码构建

    我正在尝试建立mySQL 连接器 C 从源头在视觉工作室2012为了64 bit建筑学 我知道这取决于一些boost头文件和C 连接器 跑步CMake生成一个项目文件 但该项目文件无法编译 因为有一大堆非常令人困惑的错误 这些错误可能与包含
  • ASP.NET Core 中间件与过滤器

    在阅读了 ASP NET Core 中间件之后 我对何时应该使用过滤器以及何时应该使用中间件感到困惑 因为它们似乎实现了相同的目标 什么时候应该使用中间件而不是过滤器 9频道有一个关于此的视频 ASP NET 怪物 91 中间件与过滤器 h
  • .NET 和 Mono 之间的开发差异

    我正在研究 Mono 和 NET C 将来当项目开发时我们需要在 Linux 服务器上运行代码 此时我一直在研究 ASP NET MVC 和 Mono 我运行 Ubuntu 发行版 想要开发 Web 应用程序 其他一些开发人员使用 Wind
  • 如何在C#中控制datagridview光标移动

    我希望 datagridview 光标向右移动到下一列 而不是在向单元格输入数据后移动到下一行 我试图通过 dataGridView1 KeyDown 事件捕获键来控制光标 但这并不能阻止光标在将数据输入到单元格后移动到下一行 提前感谢你的
  • C:设置变量范围内所有位的最有效方法

    让我们来int举个例子 int SetBitWithinRange const unsigned from const unsigned to To be implemented SetBitWithinRange应该返回一个int其中所有
  • 构建 C# MVC 5 站点时项目之间的处理器架构不匹配

    我收到的错误如下 2017 年 4 月 20 日构建 13 23 38 C Windows Microsoft NET Framework v4 0 30319 Microsoft Common targets 1605 5 警告 MSB3
  • winform c# 中的弹出窗口

    我正在开发一个需要弹出窗口的项目 但问题是我还希望能够通过表单设计器在此弹出窗口中添加文本框等 所以基本上我有一个按钮 当您单击它时 它将打开我在表单设计器中设计的另一个窗口 我一直在谷歌搜索 但还没有找到我需要的东西 所以我希望你们能帮助
  • ContentDialog Windows 10 Mobile XAML - 全屏 - 填充

    我在项目中放置了一个 ContentDialog 用于 Windows 10 上的登录弹出窗口 当我在移动设备上运行此项目时 ContentDialog 未全屏显示 并且该元素周围有最小的填充 在键盘上可见 例如在焦点元素文本框上 键盘和内

随机推荐

  • 0欧姆电阻能流过无穷大电流吗

    电阻有插件电阻和贴片电阻 电阻的功率P II R 那么有的同学就要问了 我们0R的电阻是不是可以流过无穷打的电流呢 答案是否定的 其实我们可以在电阻的规格书上找到答案 我以普通贴片电阻为例 大家可以看下贴片电阻数据手册中标有jumper这个
  • JetBrains CLion/IDEA/PyCharm字体、Tab退四格、编译器和解释器设置

    文章目录 CLion设置代码字体大小 设置Tab键退四格 安装cygwin编译器 设置project编译器 IDEA设置代码字体大小 设置Tab键退四格 设置project解释器 project添加第三方jar包 PyCharm设置代码字体
  • Apache

    看到这个有没有想到阿帕奇 武装直升机 显然他不是呀 下面让我们一起了解一下Apache吧 一 概述 Apache是一个开源的 多平台 可扩展的Web服务器软件 它由Apache软件基金会开发和维护 目前是互联网上使用最广泛的Web服务器软件
  • 多台群晖实现按计划WOL网络自动唤醒数据冷备份

    几年前买了2盘位的DS218 但是随着照片的增加已经不够用 年中购入了4盘位的群晖DS923 2块16T西数数企业级硬盘 1块2T intel企业级 SSD 1 什么是冷备份 冷备是离线备份 备份好的数据可以单独存取 定期冷备可以保证数据安
  • 浅谈初次做外包项目及背后的思考

    谈起外包经历 我的第一次外包源自前两年某天陪着女友逛商场时 接到一个朋友的电话 朋友兴高采烈地跟我介绍一个大项目 需求不多 钱不少 难度不大 口气不小 我一听心动了 原以为要赚一笔 easy money 后面再看看 这次外包踩了大大小小不少
  • 手撕哈希表(HashTable)——C++高阶数据结构详解

    目录 传统艺能 概念 哈希碰撞 哈希函数 解决哈希冲突 闭散列 开散列 闭散列实现 数据插入 数据查找 数据删除 开散列实现 插入数据 查找数据 数据删除 利用素数来规定哈希表大小 实现方案 传统艺能 小编是双非本科大一菜鸟不赘述 欢迎米娜
  • 镜头选型——景深计算

    正在上传 重新上传取消 1 概述 先看两个例子 拍摄花 昆虫等照片时 背景拍的比较模糊 突出被拍物 但当拍摄纪念照 风景等照片时 却会把背景拍摄得和被拍对象一样清晰 这两者就是不同景深 前者为浅景深 拍摄聚焦到被拍物上 只能拍清一小段距离
  • JavaScript let 和 const

    在JavaScript中 let 和 const 是用于声明变量的关键字 let 关键字用于声明一个块级作用域的变量 块级作用域是指在一个代码块 通常是在花括号 内部 中声明的变量只在该代码块内部有效 例如 javascript funct
  • MATLAB使用Simulink 进行建模与仿真方法 - Simulink基本操作与入门教程

    Simulink 是 MATLAB 很强大的功能组件 广泛用于系统建模 仿真和分析 下面分享给大家MATLAB使用Simulink 进行建模与仿真方法 步骤 希望能够帮助大家 1 工具 原料 电脑 MATLAB及Simulink 组件 MA
  • 对于产业互联网参与者来讲,只需要重构穿传统意义上的生产关系即可

    消费互联网模式的固定思维 让玩家们想当然地认为 所谓的产业互联网 仅仅只是一种重构生产关系的过程 对于产业互联网的玩家们来讲 他们只需要重构穿传统意义上的生产关系即可 正是在这样一种思维的影响之下 我们才看到了以新零售为代表的诸多看似新物种
  • 2023最新版本Activiti7系列-网关服务

    网关篇 网关可控制流程的执行流向 常用于拆分或合并复杂的流程场景 在Activiti7中 有以下几种类型的网关 排他网关 Exclusive Gateway 用于在流程中进行条件判断 根据不同的条件选择不同的分支路径 只有满足条件的分支会被
  • 使用python读取gif,合并gif,视频转换为gif

    一 将视频转换为gif 采用opencv读取gif图并使用imageio转换 import cv2 import imageio def read video video path video cap cv2 VideoCapture vi
  • centos7 从python 2.7升级到python 3.6

    1 检查之前系统的python版本 root localhost python Python 2 7 5 default Apr 2 2020 13 16 51 GCC 4 8 5 20150623 Red Hat 4 8 5 39 on
  • VanillaNet实战:使用VanillaNet实现图像分类(一)

    文章目录 摘要 安装包 安装timm 安装 grad cam 数据增强Cutout和Mixup EMA 项目结构 计算mean和std 生成数据集 摘要 论文翻译 https blog csdn net m0 47867638 articl
  • 深圳市科技创新委员会关于2021年高新技术企业培育库拟入库企业名单公示的通知

    根据 深圳市高新技术企业培育资助管理办法 深科技创新规 2021 5号 有关要求 2021年高新技术企业培育库入库申请企业中 符合以下条件的企业获得入库资格 1 未获得过高新技术企业资格 2 未获得过高新技术企业培育库入库资格 3 符合市科
  • UE4中Cesium插件使用(一)

    一 前提条件 UE4 引擎4 26 及以上 Cesium账号 在官网注册 二 添加插件 UE4 4 26自带 下载插件 1 打开UE4引擎界面在插件设置页面 搜索cesium 点击启用 然后重启UE4 2 如果在插件列表搜不到cesium插
  • pycharm安装过程中激活方法(最方便)

    本人新手 在学习python时选择用pycharm来使用 因为下载的是专业版 所以要激活 在网上找了好多激活码和License server 结果发现都被封了 下面介绍一种最简单无脑的方法 亲测有效
  • 3个技术男搞恋爱版 ChatGPT,估值70亿...

    过去几个月 我们见证了GPT从3 5到4 0 从只能做结构化搜索整合到接近人类思维的对话 我们还看到了 GPT逐步掌握画画 写作 剪辑 制表 做 PPT 等技能 最可怕的是AI的迭代速度 简直是一天一个样 这股这股前所未有的技术浪潮 一时间
  • 通信原理实验指导书_通信原理实验——SystemView的安装与使用

    一 SystemView的安装
  • Stable Matching-稳定匹配问题【G-S算法,c++】

    Stable Matching 稳定匹配问题 G S算法 c 题目描述 Gale Shapley算法 解题思路一 G S算法 Gale Shapley算法 题目描述 Gale Shapley算法 Teenagers from the loc