郑州网站优化哪家专业/南宁seo关键词排名
Stable Matching-稳定匹配问题【G-S算法,c++】
- 题目描述:(Gale-Shapley算法)
- 解题思路一:G-S算法(Gale-Shapley算法)
题目描述:(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' thenm保持自由Else w相较于m'更爱m(m,w)变成约会状态m'变成自由状态EndifEndif
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号manman[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
相关文章:

Stable Matching-稳定匹配问题【G-S算法,c++】
Stable Matching-稳定匹配问题【G-S算法,c】题目描述:(Gale-Shapley算法)解题思路一:G-S算法(Gale-Shapley算法)题目描述:(Gale-Shapley算法) Teenagers from the local high school have asked you to help them with the organ…...

TypeScript(四)接口
目录 前言 定义 用法 基本用法 约定规则 属性控制 任意属性 可选属性 只读属性 定义函数 冒号定义 箭头定义 接口类型 函数接口 索引接口 继承接口 类接口 总结 前言 在介绍TS对象类型中,为了让数组每一项更具体,我们使用 string [ ]…...

Python-基础知识
目录 Python 简介 Python 发展历史 Python 特点 Python 标识符 Python 保留字符 行和缩进 多行语句 Python 引号 Python注释 Python 简介 Python 是一个高层次的结合了解释性、编译性、互动性和面向对象的脚本语言。 Python 的设计具有很强的可读性,相比…...

【java基础】集合基础说明
文章目录基本介绍Collection接口Iterator和Iterable接口Map接口关于Iterator接口的一些说明框架中的接口具体集合总结基本介绍 集合就是存储用来存储一系列数据的一种数据结构。在这篇文章中会介绍集合的一些基本概念。 Collection接口 集合的基本接口是Collection接口&…...

MySQL的下载及安装详细教程
提示:本文仅为MySQL初学者的安装MySQL过程提供参考,创作不易,请多点赞支持! MySQL的下载及安装前言一、MySQL的下载及安装1.MySQL的下载2.MySQL的安装3.配置环境变量4.连接MySQL4.1 方式一4.2 方式二前言 本文内容主要是帮助初学…...

SSL/TLS协议工作原理
SSL/TLS协议工作原理 SLL/TLS协议工作在应用层和传输层之间,应用层数据需要经过SSL/TLS层的加密之后才会发送到传输层。SSL/TLS协议有两个重要协议:握手协议、记录协议。 1. 握手协议 TCP三次握手完成后,才能进行SSL/TLS的握手。 因为&#…...

大数据项目实战之数据仓库:用户行为采集平台——第4章 用户行为数据采集模块
第4章 用户行为数据采集模块 4.1 数据通道 4.2 环境准备 4.2.1 集群所有进程查看脚本 1)在/home/atguigu/bin目录下创建脚本xcall [atguiguhadoop102 bin]$ vim xcall2)在脚本中编写如下内容 #! /bin/bashfor i in hadoop102 hadoop103 hadoop104 d…...

《统计学习方法》(李航)——学习笔记
第一章 概论统计学习,又称统计机器学习(机器学习),现在提到的 机器学习 往往指的就是 统计机器学习。统计学习研究的对象是数据,其对数据的基本假设是同类数据存在一定的统计规律性,因此可以用概率统计方法…...

阿里云EMR集群搭建及使用
目录 1.简介 1.什么是EMR 2.组成 3.与自建hadoop集群对比 4.产品架构 2.使用 1.创建EMR集群 1.登录EMR on ECS控制台 2.软件设置 3.硬件设置 3.基础配置 2.配置 1.组件配置 2.用户管理 3.安全组 4.Gateway 3.组件UI 1.简介 1.什么是EMR EMR是运行在阿里云平台…...

学习streamlit-4
st.slider 今天学习st.slider滑块组件的使用。 st.slider滑块组件通常被用来作为应用的输入,支持整数、浮点数、日期、时间和日期时间。 下面的示例程序包含以下简单功能,以演示st.slider滑块组件: 用户通过调整滑块选择值应用打印出所选…...

高级Oracle DBA面试题及答案
作为高级 Oracle DBA,您将负责 Oracle 数据库基础架构的设计、安装、配置、监控和维护。您还将负责制定和实施备份和恢复计划,并确保数据的安全性和完整性。要成功担任此职位,您需要对 Oracle 数据库架构有深入的了解,并能够有效地…...

程序员成长路线
程序员在成长的过程中,不同的阶段,需要关注的问题点一会都会有所不同,今天给大家分享下自己的感受。 0-1年,入门,掌握语言基础、提高工具的使用熟练度。 工作第一年,主要围绕ssm三件套、mysql、red…...

【Galois工具开发之路】关于类的重新装载思路
思路 当一个java的类文件发生变更,如果动态的热更新这个新的类文件?目前来说,有两种可能的方式 新增一个自定义ClassLoader,名为NC,让NC去load这个新的类文件,这样就完成了新的类定义的替换 但目前Java有…...

哪款蓝牙耳机音质好?内行推荐四款高音质蓝牙耳机
蓝牙耳机经过近几年的快速发展,在音质上的表现也越来越好。哪款蓝牙耳机音质好?最近看到很多人问。接下来,我来给大家推荐四款高音质蓝牙耳机,可以当个参考。 一、南卡小音舱蓝牙耳机 参考价:246 发声单元ÿ…...

Android程序自动在线升级安装
安卓小白分享: Android程序自动在线升级安装.(通过GetSharedDownloadsPath方法) 1>.修改AndroidManifest.template.xml ( 此文件在你DELPHI项目的目录中,如找不到就文件查找吧) 最好把此文件拖到DELPHI, 用DELPHI打开,(这样,它会一行一行格式清楚) 找到文字<%u…...

JS的BroadcastChannel与MessageChannel
BroadcastChannel与MessageChannel BroadcastChannel BroadcastChannel以广播的形式进行通信 BroadcastChannel用于创建浏览器标签页之间的通信 使用BroadcastChannel的浏览器标签页面必须要遵循同源策略 页面1使用BroadcastChannel创建一个频道,页面2使用Broadc…...

nextjs开发 + vercel 部署 ssr ssg
前言 最近想实践下ssr 就打算用nextjs 做一个人博客 , vercel 部署 提供免费域名,来学习实践下ssr ssg nextjs 一个轻量级的react服务端渲染框架 vercel 由 Next.js 的创建者制作 支持nextjs 部署 免费静态网站托管 初始化项目 npx create-next-app p…...

Good Idea, 利用MySQL JSON特性优化千万级文库表
👳我亲爱的各位大佬们好😘😘😘 ♨️本篇文章记录的为 利用MySQL JSON特性优化千万级文库表 相关内容,适合在学Java的小白,帮助新手快速上手,也适合复习中,面试中的大佬🙉🙉…...

【python游戏制作】快来跟愤怒的小鸟一起攻击肥猪们的堡垒吧
前言 嗨喽~大家好呀,这里是魔王呐 ❤ ~! 为了防止/报复偷走鸟蛋的肥猪们,鸟儿以自己的身体为武器, 仿佛炮弹一样去攻击肥猪们的堡垒,保卫自己的鸟蛋 这个游戏大家没玩过的想必也听说过~ 今天就给大家分享一下用python写的愤怒的…...

ARM 学习(一)
ARM 处理器的运行模式ARM处理器共有7种运行模式,如下表所示:处理器模式描述用户模式(User)正常程序运行模式中断模式(IRQ)用于通常的中断处理快速中断模式(FIQ)用于高速传输和通道处…...

深入分析Java的序列化与反序列化
序列化是一种对象持久化的手段。普遍应用在网络传输、RMI等场景中。本文通过分析ArrayList的序列化来介绍Java序列化的相关内容。主要涉及到以下几个问题: 怎么实现Java的序列化 为什么实现了java.io.Serializable接口才能被序列化 transient的作用是什么 怎么自…...

、Tomcat源码分析-类加载器
接下来,我们再来看下 tomcat 是如何创建 common 类加载器的。关键代码如下所示,在创建类加载器时,会读取相关的路径配置,并把路径封装成 Repository 对象,然后交给 ClassLoaderFactory 创建类加载器。 Bootstrap.java…...

反转链表相关的练习(下)
目录 一、回文链表 二、 重排链表 三、旋转链表 一、回文链表 给你一个单链表的头节点 head ,请你判断该链表是否为回文链表。如果是,返回 true ;否则,返回 false 。 示例 1: 输入:head [1,2,2,1] 输…...

2.进程和线程
1.进程1.1 终止正常退出(自愿)出错退出(自愿)严重错误(非自愿)被其他进程杀死(非自愿)1.2 状态就绪态:可运行,但因为其他进程正在运行而暂时停止阻塞态:除非某种外部事件发生,否则进程不能运行1.3 实现一个进程在执行过程中可能被…...

C++回顾(十四)—— 函数模板
14.1 概述 所谓函数模板(function template),实际上是建立一个通用函数,其函数类型和形参类型不具体指定,用一个虚拟的类型来代表。这个通用函数就称为函数模板。凡是函数体相同的函数都可以用这个模板来代替,不必定义多个函数&a…...

如何做好项目各干系人的管理及应对?
如何更好地识别、分析和管理项目关系人?主要有以下几个方面: 1、项目干系人的分析 一般对项目干系人的分析有2种方法, 方法一:权利(影响),即对项目可以产生影响的人; 方法二…...

Elasticsearch使用系列-ES增删查改基本操作+ik分词
一、安装可视化工具KibanaES是一个NoSql数据库应用。和其他数据库一样,我们为了方便操作查看它,需要安装一个可视化工具 Kibana。官网:https://www.elastic.co/cn/downloads/kibana和前面安装ES一样,选中对应的环境下载࿰…...

07-PL/SQL基础(if语句,case语句,循环语句)
本章主要内容: 1.PL/SQL的基本构成:declare,begin,exception,end; 2.结构控制语句:IF语句,CASE语句 3.循环结构:loop循环,for loop循环,while loop循环 PL/SQL的基本构成 特点 PL/SQL语言是SQL语言的扩展ÿ…...

信捷 XDH Ethercat A_VELMOVE
本文描述信捷 EthercatA_VELMOVE指令,以设定的速度持续运行 上图中,在M100的上升沿,执行A_VELMOVE指令。A_VELMOVE HD100 D100 M101 K0HD100输入参数起始地址 ,HD118输入参数末尾地址HD100~HD103,双精度浮点数(64位&am…...

【专项训练】分治、回溯
分治、回溯其实就是递归,只是是递归的一个细分,是一种特殊的递归 碰到一个题目,你就找他的重复性 最近重复性:根据重复性怎么构造以及如何分解,包括:分治、回溯 最优重复性:动态规划 本质:找重复性、分解问题、组合子问题的结果 回溯:试错! 50. Pow(x, n) https:…...