【LA 3989 训练指南】女士的选择 【稳定婚姻问题】
我们先来学一下稳定婚姻问题
什么是稳定婚姻问题?
有n个女士和n个男士,他们要一一进行配对。每个男士心中对这n个女士都有一个排名,同理,每个女士心里对n个男性也有一个排名。我们要做的是,在他们配对完成以后,不存在以下这种情况:女士a和男士b进行了配对,但是女士c在男士b心里的排名要高于a,而且男士b在女士c心里的排名也高于女士c当前的伴侣,因为如果出现这种情况男士b和女士c很有可能抛下现在的配对对象而“出轨”。同理女士a也不存在一个男士d,条件也是如此。
我们有一个专门的算法来解决这个问题。算法的大致过程就是男士不断地求婚,而女士不断地拒绝的过程。
在每一轮中,每个单身的男人在没有拒绝过他的女士中找到一个在他心里排名最高的女士进行表白,然后被表白的女士如果此时是单身,那么就会先接受这个男士的表白,暂时和他配对。如果这个女士已经有配对的对象,那么此时这个女士就会比较现在这个向她表白的男士和她现在的配对对象谁再她心里的排名更高,然后她会选择排名更高的那一个拒绝掉另一个。
然后我们再来看这道【LA3989】
在一个盛大的校园舞会上有n位男生和n位女生,每个人都对每个异性有一个排序,代表对他们的喜欢程度。你的任务是将男生和女生一一配对(每个人恰好有一个舞伴),使得男生u和女士v不存在以下情况 1.男生u和女生v不是舞伴;2.他们喜欢对方的程度都大于喜欢各自自己当前舞伴的程度。如果出现了2中的情况,他们可能会擅自抛下自己的舞伴,另外组成一对。
你的任务是对于每个女生,在所有可能和她跳舞的男生中,找出她最喜欢的那个。
这个题就是稳定婚姻问题的模板题了,直接套我们上面的模板的方法就可以。
code from LRJ
#include <cstdio>
#include <algorithm>
#include <iostream>
#include <cstring>
#include <queue> using namespace std; const int maxn=+;
int pref[maxn][maxn],order[maxn][maxn],Next[maxn];
int future_husband[maxn],future_wife[maxn];
queue<int>q;
void engage(int man,int woman){
int m=future_husband[woman];
if(m){
future_wife[m]=;
q.push(m);
}
future_wife[man]=woman;
future_husband[woman]=man;
} int main(){
int T;
scanf("%d",&T);
while(T--){
int n;
scanf("%d",&n);
for(int i=;i<=n;i++){
for(int j=;j<=n;j++)
scanf("%d",&pref[i][j]);//编号为i的男士第j喜欢的人
Next[i]=; //接下来应该向排名为1的女士求婚
future_wife[i]=; //没有未婚妻
q.push(i);
}
for(int i=;i<=n;i++){
for(int j=;j<=n;j++){
int x;
scanf("%d",&x);
order[i][x]=j; //在编号为i的女士心目中,编号为x的男性的排名
}
future_husband[i]=; //没有未婚夫
}
while(!q.empty()){
int man=q.front();q.pop();
int woman=pref[man][Next[man]++];//下一个求婚对象
if(!future_husband[woman])
engage(man,woman);
else if(order[woman][man]<order[woman][future_husband[woman]])
engage(man,woman);
else q.push(man);
}
while(!q.empty())q.pop();
for(int i=;i<=n;i++) printf("%d\n",future_wife[i]);
if(T)printf("\n");
}
return ;
}
【LA 3989 训练指南】女士的选择 【稳定婚姻问题】的更多相关文章
- 训练指南 UVALive - 3989(稳定婚姻问题)
ayout: post title: 训练指南 UVALive - 3989(稳定婚姻问题) author: "luowentaoaa" catalog: true mathjax ...
- LA 3989 - Ladies' Choice 稳定婚姻问题
https://icpcarchive.ecs.baylor.edu/index.php?option=com_onlinejudge&Itemid=8&page=show_probl ...
- 【UVAlive 3989】 Ladies' Choice (稳定婚姻问题)
Ladies' Choice Teenagers from the local high school have asked you to help them with the organizatio ...
- Ladies' Choice UVALive - 3989 稳定婚姻问题 gale_shapley算法
/** 题目: Ladies' Choice UVALive - 3989 链接:https://vjudge.net/problem/UVALive-3989 题意:稳定婚姻问题 思路: gale_ ...
- 训练指南 UVALive - 5713(最小生成树 + 次小生成树)
layout: post title: 训练指南 UVALive - 5713(最小生成树 + 次小生成树) author: "luowentaoaa" catalog: true ...
- LA3989女士的选择
题意: 给你n个男士n个女士,然后给你每个男士中女士的排名,和每个女士中每个男士在他们心中的排名,问你是否可以组成稳定的舞伴,如果存在以下情况(1)男生u和女生v不是舞伴,他们喜欢对方的程 ...
- poj 1961 Period(KMP训练指南例题)
Period Time Limit: 3000MS Memory Limit: 30000K Total Submissions: 11356 Accepted: 5279 Descripti ...
- 算法竞赛入门经典训练指南——UVA 11300 preading the Wealth
A Communist regime is trying to redistribute wealth in a village. They have have decided to sit ever ...
- [置顶] 刘汝佳《训练指南》动态规划::Beginner (25题)解题报告汇总
本文出自 http://blog.csdn.net/shuangde800 刘汝佳<算法竞赛入门经典-训练指南>的动态规划部分的习题Beginner 打开 这个专题一共有25题,刷完 ...
随机推荐
- 关于在2.7中出现 "UnicodeWarning: Unicode equal comparison failed to convert both arguments to Unicode - interpreting them as being unequal"
在中文字符串前面加u. Make sure your code is in UTF-8 (NOT Latin-1) and/or use a coding line as so: #! /usr/bi ...
- C#.NET抽象类和接口的区别?
声明方法的存在而不去实现它的类被叫做抽象类(abstract class),它用于要创建一个体现某些基本行为的类,并为该类声明方法,但不能在该类中实现该类的情况.不能创建abstract 类的实例.然 ...
- python 与时间有关的操作
python保存时间戳文件 import time # ISOTIMEFORMAT='%Y-%m-%d %X' ISOTIMEFORMAT='%Y-%m-%d' t= time.strftime( I ...
- How to install torcs package in Debian
Installation instructions Installing torcs package in Debian Wheezy is as easy as running: 没想到在debia ...
- socket编程 —— 非阻塞socket (转)---例子已上传至文件中
在上一篇文章 <socket编程——一个简单的例子> http://blog.csdn.net/wind19/archive/2011/01/21/6156339.aspx 中写了一个简单 ...
- CentOS7 php7 安装 curl 扩展
直接从php源码包中,使用root权限安装. 找到原先安装PHP的源码包文件(如果已经删掉需要重新下载原来版本的源码包并解压) 我的php源码包在root家目录下. cd /php-7.1.4/ext ...
- 网络 、osi 七层模型、tcp/ip 五层参考
网络 网络的本质就是通讯,比特传输 网络拓扑 物理布局pc -- 交换机 -- 路由器逻辑布局pc -- 路由器 交换机的产生 网络之初,是通过网线互相连通到各个主机,存在的问题就是2个pc都要与服务 ...
- Android利用百度云来识别身份证及各种证件的信息
上一篇中我已经介绍过了ocr,及google出来的tess-two的使用. 接下来我来介绍一个更方便的身份证识别系统,当然它本身也是利用ocr来识别文字的,不过它处理的更好,可以为我们提供更快,更准确 ...
- NIO buffer 缓冲区 API
package bhz.nio.test; import java.nio.IntBuffer; public class TestBuffer { public static void main(S ...
- day9-数据库操作与Paramiko模块
堡垒机前戏 开发堡垒机之前,先来学习Python的paramiko模块,该模块机遇SSH用于连接远程服务器并执行相关操作 SSHClient 用于连接远程服务器并执行基本命令 基于用户名密码连接: 1 ...