The Stable Marriage Problem 【HDU - 1914】【稳定婚姻匹配问题】

2023-11-16

题目链接


Problem Description

The stable marriage problem consists of matching members of two different sets according to the member’s preferences for the other set’s members. The input for our problem consists of:

a set M of n males;
a set F of n females;

for each male and female we have a list of all the members of the opposite gender in order of preference (from the most preferable to the least).
A marriage is a one-to-one mapping between males and females. A marriage is called stable, if there is no pair (m, f) such that f ∈ F prefers m ∈ M to her current partner and m prefers f over his current partner. The stable marriage A is called male-optimal if there is no other stable marriage B, where any male matches a female he prefers more than the one assigned in A.

Given preferable lists of males and females, you must find the male-optimal stable marriage.
 

Input

The first line gives you the number of tests. The first line of each test case contains integer n (0 < n < 27). Next line describes n male and n female names. Male name is a lowercase letter, female name is an upper-case letter. Then go n lines, that describe preferable lists for males. Next n lines describe preferable lists for females.
 

Output

For each test case find and print the pairs of the stable marriage, which is male-optimal. The pairs in each test case must be printed in lexicographical order of their male names as shown in sample output. Output an empty line between test cases.
 

Sample Input

2 3 a b c A B C a:BAC b:BAC c:ACB A:acb B:bac C:cab 3 a b c A B C a:ABC b:ABC c:BCA A:bac B:acb C:abc

Sample Output

a A b B c C a B b A c C


  这道题与基本的稳定婚姻匹配问题稍微多了一个条件,就是需要去满足男生得到的是最优的这样的一个情况,那么也就是我们需要去保证,男生是先去选的,还是男孩纸最求女生问题,因为只有主动才是能获得自己的最优的女盆友的呀!

  然后,剩下的就是稳定婚姻匹配的模板了。

#include <iostream>
#include <cstdio>
#include <cmath>
#include <string>
#include <cstring>
#include <algorithm>
#include <limits>
#include <vector>
#include <stack>
#include <queue>
#include <set>
#include <map>
#include <unordered_map>
#define lowbit(x) ( x&(-x) )
#define pi 3.141592653589793
#define e 2.718281828459045
#define INF 0x3f3f3f3f
#define HalF (l + r)>>1
#define lsn rt<<1
#define rsn rt<<1|1
#define Lson lsn, l, mid
#define Rson rsn, mid+1, r
#define QL Lson, ql, qr
#define QR Rson, ql, qr
#define myself rt, l, r
using namespace std;
typedef unsigned long long ull;
typedef long long ll;
const int maxN = 27;
unordered_map<char, int> mp_b, mp_g;
int N, boy_love[maxN][maxN], girl_love[maxN][maxN];
char str_b[maxN], str_g[maxN];
char into[50];
int boy[maxN], girl[maxN], kth[maxN];
inline void G_S()
{
    for(int i=1; i<=N; i++) boy[i] = girl[i] = kth[i] = 0;
    bool flag = true;
    while(true)
    {
        flag = false;
        for(int i=1; i<=N; i++)
        {
            if(!boy[i])
            {
                int g = boy_love[i][++kth[i]];
                if(!girl[g])
                {
                    girl[g] = i;
                    boy[i] = g;
                    continue;
                }
                else if(girl_love[g][i] < girl_love[g][girl[g]])
                {
                    boy[girl[g]] = 0;
                    girl[g] = i;
                    boy[i] = g;
                }
                flag = true;
            }
        }
        if(!flag) break;
    }
    for(int i=1; i<=N; i++)
    {
        printf("%c %c\n", str_b[i], str_g[boy[i]]);
    }
}
inline void init()
{
    mp_b.clear();
    mp_g.clear();
}
int main()
{
    int T; scanf("%d", &T);
    int Cas = 0;
    while(T--)
    {
        if(Cas++ > 0) printf("\n");
        scanf("%d", &N);
        init();
        for(int i=1; i<=N; i++)
        {
            scanf("%s", into);
            str_b[i] = into[0];
            mp_b[str_b[i]] = i;
        }
        for(int i=1; i<=N; i++)
        {
            scanf("%s", into);
            str_g[i] = into[0];
            mp_g[str_g[i]] = i;
        }
        for(int i=1; i<=N; i++)
        {
            scanf("%s", into);
            int which_boy = mp_b[into[0]], len = (int)strlen(into);
            for(int j=2; j<len; j++)
            {
                boy_love[which_boy][j-1] = mp_g[into[j]];
            }
        }
        for(int i=1; i<=N; i++)
        {
            scanf("%s", into);
            int which_girl = mp_g[into[0]], len = (int)strlen(into);
            for(int j=2; j<len; j++)
            {
                girl_love[which_girl][mp_b[into[j]]] = j - 1;
            }
        }
        G_S();
    }
    return 0;
}

 

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

The Stable Marriage Problem 【HDU - 1914】【稳定婚姻匹配问题】 的相关文章

  • 质数

    include
  • 东北大学acm训练第五周

    include
  • Connections between cities 【HDU - 2874】【在线LCA算法】

    题目链接 昨天刚学了在线LCA 今天就来硬刚这道题还是花了一整天的时间 不过对于LCA却有了更多的理解 这道题在讲述不同根的做法上尤其是很好的 题目告诉我们有N个节点和M条边 以及C次询问 每次查询的是 L R 这两个节点间的距离 还是算得
  • 数据结构 图 part2

    文章目录 图的遍历 深度优先遍历 DFS 遍历步骤 邻接矩阵的存储 邻接表的存储 广度优先遍历 BFS 遍历步骤 非连通图的遍历 连通分量 如何遍历 生成树 图的遍历 深度优先遍历 DFS 遍历步骤 在访问图中某一起始顶点v后 由v出发 访
  • 【构造】0617 Edge Split

    题意 给定一个 n n n 点 m m m 条边的无向连通图 其中 1
  • Road Construction POJ - 3352(tarjan双连通缩点模板)

    题目描述 给一个无向连通图 至少添加几条边使得去掉图中任意一条边不改变图的连通性 即使得它变为边双连通图 include
  • 无向图的遍历-BFS与DFS

    一 理论部分 无向图的遍历可用深度搜索 DFS 与广度搜索 BFS 深度搜索的基本方式是由图的一个节点1出发然后随机选一个与其相邻的节点2 接着在选择一个与其相邻的节点3 当一条路遍历完后再选择最近一个遍历过的 且相邻节点有未遍历过的节点
  • Codeforces-1454E Number of Simple Paths(基环树-思维)

    题目大意 给你n个点 n条边 求图中简单路径的个数 题目思路 n个点n条边 那么图中一定有一个环 拿这个图来讲 我们将两点间的关系分为4种 1 两点都在环上 简单路径的个数为2 例如2与5 2 一个点在环上一个点不在环上 简单路径个数为2
  • 树形dp(例题)

    树的最长路径带权值 树的直径可能时红色的边 从上图可以看出 每次要两个变量存放以u为根 最长路径d1 和次长路径d2 那么整个树的最长路径就有可能是d1 d2 我们每次要返回以u为根的贯穿试的最长路径 给他的父节点判断使用如下图 inclu
  • 离散数学第一章总结

    离散数学第一章 1 公式类型 1 重言式 也是永真式 公式真值恒为1 2 矛盾式 永假式 真值恒为0 3 可满足式 不是矛盾式的就都是可满足式 重言式一定是可满足式 2 成真赋值与成假赋值 也叫成真指派与成假指派 一组原子的取值 真值指派
  • 《算法图解》读书笔记(二)

    第六章 图 广度优先搜索 1 解决最短路径问题 shortest path problem 的算法被称为广度优先搜索 breadth first search 2 图由节点 node 和边 edge 组成 一个节点可能与众多节点直接相连 这
  • Codeforces Round #751 (Div. 2) D. Frog Traveler(BFS)

    题解 因为我们最多把所有的点跳一遍么 所以直接BFS模拟一下就行了 注意现在跳的点不能是以前已经跳过的点 并且只能越跳越高 否则没有意义 这样就保证了时间复杂度是线性的 AC代码 include
  • How far away ? 【HDU - 2586】【DFS+链式前向星优化】

    题目链接 其实这道题可以不用链式前向星优化换做vector lt gt 也是可以跑的 只是会许会慢些而已 来换个中文题意好读些 勇气小镇是一个有着n个房屋的小镇 为什么把它叫做勇气小镇呢 这个故事就要从勇气小镇成立的那天说起了 修建小镇的时
  • 数据结构算法—邻接表存储的无向图求连通分量个数

    数据结构算法 邻接表存储的无向图求连通分量个数 邻接表存储结构 typedef struct ArcNode int adjvex 边指向的顶点 struct ArcNode nextarc 下一条边的指针 ArcNode typedef
  • 图 - Java实现无向带权图的邻接矩阵表示法

    图 Java实现无向带权图的邻接矩阵表示法 1 图 1 1 图的介绍 图 Graph 是一种复杂的非线性表结构 图中的元素我们就叫做顶点 vertex 图中的一个顶点可以与任意其他顶点建立连接关系 我们把这种建立的关系叫做边 edge 跟顶
  • Binary Tree on Plane【费用流】

    题目链接 CF 277 E 题意翻译 给你平面上 n 个点 2 n 400 要求用这些点组成一个二叉树 每个节点的儿子节点不超过两个 定义每条边的权值为两个点之间的欧几里得距离 求一个权值和最小的二叉树 并输出这个权值 其中 点 i 可以成
  • 第14届蓝桥杯C++B组省赛

    文章目录 A 日期统计 B 01 串的熵 C 冶炼金属 D 飞机降落 E 接龙数列 F 岛屿个数 G 子串简写 H 整数删除 I 景区导游 J 砍树 今年比去年难好多 Update 2023 4 10 反转了 炼金二分没写错 可以AC了 U
  • 数模培训第二周——图论模型

    图论中最短路算法与程序实现 图论中的最短路问题 包括无向图和有向图 是一个基本且常见的问题 主要的算法有Dijkstra算法和Floyd算法 Floyd算法 简介 Floyd Warshall算法 英语 Floyd Warshall alg
  • E (1052) : DS树--带权路径和

    文章目录 一 题目描述 二 输入与输出 1 输入 2 输出 三 参考代码 一 题目描述 计算一棵二叉树的带权路径总和 即求赫夫曼树的带权路径和 已知一棵二叉树的叶子权值 该二叉树的带权路径和APL等于叶子权值乘以根节点到叶子的分支数 然后求
  • 860.染色法判定二分图

    二分图是指一个图中的所有顶点可以分为两部分 并且每条边连接的是属于不同部分的两个顶点 include

随机推荐

  • Python最常用的7个框架讲解!

    众所周知 Python语言中内置了很多框架 拿来即用 为我们的工作带来了很多便利 也提高了效率 本文为大家介绍7种常见且实用的Python框架 主要包括 Django flask scrapy Diesel Cubes Pulsar和Tor
  • Apipost,更懂中国程序员的接口调试神器

    Hello 大家好 我是灰小猿 一个超会写bug的程序猿 作为一名Java后端程序猿 对接口调试简直是家常便饭 尤其是在进行接口联调的时候 往往因为和前端对接口的理解程度不同 于是乎就出现了 而且 程序员的蹩脚英语往往是不能区分Java和j
  • 修改Tomcat的默认端口号

    1 找到Tomcat的安装路径 2 打开conf文件夹 3 用记事本打开server xml文件 4 找到
  • 从Vue-cli脚手架的基本使用到vue路由的基本使用

    第一部分 Vue cli脚手架 vue2是对新手很友好的MVVM框架 有完善的官方中文文档 阅读起来也非常容易理解 由浅入 深 示例完整 同时官方也提供了一个开箱即用的 vue cli 帮我们生成一个完整的项目框架 vue js 著名的全家
  • linux运行python代码进行训练时断开服务器中断训练解决办法

    无论是远程连接服务器还是将服务资源拉取的pycharm中使用 都会存在一个问题 就是远程客户端关闭后 服务端的训练就会终止 这样对于远程客户端的限制就非常大 为了解决这个问题 只需要在训练时按照下面命令操作即可完成 第一步 nohup py
  • Pytest的乐趣

    Pytest的乐趣 前言 安装 关键词test 关键词assert 进阶一 参数 进阶二 软断言 进阶三 配置文件pytest ini 进阶四 前后设置 进阶五 并行测试 进阶六 命令行参数扩展 前言 Pytest就是为了测试已经完成的Py
  • centos7下使用yum安装mysql数据库

    分享下装mysql数据库的过程以及远程连接的方法 整合了部分网上的资源以及自己遇到的一些问题 常用的一些命令就不一 一介绍了 话不多说 马上开始 1 下载mysql的repo源 wget http repo mysql com mysql
  • Python3 如何优雅地使用正则表达式(详解四)

    更多强大的功能 到目前为止 我们只是介绍了正则表达式的一部分功能 在这一篇中 我们会学习到一些新的元字符 然后再教大家如何使用组来获得被匹配的部分文本 更多元字符 还有一些元字符我们没有讲到 接下来小甲鱼一一为大家讲解 有些元字符它们不匹配
  • 现代控制理论(4)——李雅普诺夫稳定性理论

    文章目录 一 李雅普诺夫关于稳定性的定义 1 李氏意义下的稳定 2 渐近稳定 3 大范围渐近稳定 4 不稳定 二 李雅普诺夫第一法 1 线性系统的稳定判据 2 非线性系统的稳定判据 三 李雅普诺夫第二法 1 标量函数的定号性 2 稳定性原理
  • 钓鱼篇-利用RLO隐藏exe&文件捆绑&office免杀-远程模板加载上线CS

    RLO伪装图片执行 利用msf生成木马x exe msfvenom p windows meterpreter reverse tcp LHOST 192 168 96 128 LPORT 4444 f exe o x exe Metasp
  • 使用matlab里的集成树进行数据回归预测

    当使用MATLAB时 您可以使用集成学习方法中的决策树来进行数据回归预测 决策树回归是一种基于树状结构的机器学习算法 它通过对训练数据进行分层次的决策来进行预测连续值的输出 MATLAB提供了一个称为RegressionTree的集成树回归
  • pandas数据判断是否为NaN值的方式

    实际项目中有这样的需求 将某一列的值 映射成类别型的数据 这个时候 需要我们将范围等频切分 或者等距切分 具体的做法可以先看某一些特征的具体分布情况 然后我们选择合适的阈值进行分割 def age map x if x lt 26 retu
  • SpringBoot添加过滤器详解

    目录 一 过滤器详解 二 SpringBoot 添加过滤器 一 过滤器详解 过滤器 Filter 是 Java Web 应用中的一种重要组件 用于对请求和响应进行拦截和处理 它可以用于执行各种任务 如请求预处理 请求和响应的转换 授权检查
  • CSS Day03

    1 相对定位 relative 相对于原来位置移动 元素设置此属性之后仍然处在文档流中 不影响其他元素的布局 菜鸟教程
  • React框架学习笔记

    React系列知识点 一 项目初始化 1 react script 2 TSX 3 组件化 配置React的CSS模组 1 使用React最大的优势是模组化 CSS module 2 TS的定义声明 3 css类型声明 4 CSS in J
  • APP自动化测试-3. Appium元素定位与等待

    APP自动化测试 3 Appium元素定位与等待 文章目录 APP自动化测试 3 Appium元素定位与等待 前言 一 Appium Desired Capabilities简介 1 Appium Desired Capabilities通
  • 2022年天梯赛-全国总决赛 L2-1 插松枝 (25 分)

    又来补题了哎哎哎 考试的时候卡了一小时就离谱 include
  • c#之泛型

    using System using System Collections Generic using System Linq using System Text using System Threading Tasks namespace
  • 前端 立体照片demo

    地址 https www cnblogs com zyrblog p 11142624 html
  • The Stable Marriage Problem 【HDU - 1914】【稳定婚姻匹配问题】

    题目链接 Problem Description The stable marriage problem consists of matching members of two different sets according to the