我们先来学一下稳定婚姻问题

什么是稳定婚姻问题?

有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 训练指南】女士的选择 【稳定婚姻问题】的更多相关文章

  1. 训练指南 UVALive - 3989(稳定婚姻问题)

    ayout: post title: 训练指南 UVALive - 3989(稳定婚姻问题) author: "luowentaoaa" catalog: true mathjax ...

  2. LA 3989 - Ladies' Choice 稳定婚姻问题

    https://icpcarchive.ecs.baylor.edu/index.php?option=com_onlinejudge&Itemid=8&page=show_probl ...

  3. 【UVAlive 3989】 Ladies' Choice (稳定婚姻问题)

    Ladies' Choice Teenagers from the local high school have asked you to help them with the organizatio ...

  4. Ladies' Choice UVALive - 3989 稳定婚姻问题 gale_shapley算法

    /** 题目: Ladies' Choice UVALive - 3989 链接:https://vjudge.net/problem/UVALive-3989 题意:稳定婚姻问题 思路: gale_ ...

  5. 训练指南 UVALive - 5713(最小生成树 + 次小生成树)

    layout: post title: 训练指南 UVALive - 5713(最小生成树 + 次小生成树) author: "luowentaoaa" catalog: true ...

  6. LA3989女士的选择

    题意:       给你n个男士n个女士,然后给你每个男士中女士的排名,和每个女士中每个男士在他们心中的排名,问你是否可以组成稳定的舞伴,如果存在以下情况(1)男生u和女生v不是舞伴,他们喜欢对方的程 ...

  7. poj 1961 Period(KMP训练指南例题)

    Period Time Limit: 3000MS   Memory Limit: 30000K Total Submissions: 11356   Accepted: 5279 Descripti ...

  8. 算法竞赛入门经典训练指南——UVA 11300 preading the Wealth

    A Communist regime is trying to redistribute wealth in a village. They have have decided to sit ever ...

  9. [置顶] 刘汝佳《训练指南》动态规划::Beginner (25题)解题报告汇总

    本文出自   http://blog.csdn.net/shuangde800 刘汝佳<算法竞赛入门经典-训练指南>的动态规划部分的习题Beginner  打开 这个专题一共有25题,刷完 ...

随机推荐

  1. [LeetCode系列]组合和枚举问题

    给定一列数(未排序)和一个目标值, 找出所有可能的组合和等于目标值的组合, 数组中的数可以重复使用. 算法思路: 使用递归. 对数组排序, 从小到大; 令i = 起始下标(初始为0), 对于每一个数, ...

  2. Linux之安装软件

    1.  下载获得redis-3.0.4.tar.gz后将它放入我们的Linux目录/opt 2. 在SecureCRT界面上点SecureFX图标 在本地窗口中找到要上传的文件 在要上传的文件上点右键 ...

  3. mysql innodb引擎事务的隔离级别

    一.事务的基本要素(ACID) 1.原子性(Atomicity):事务开始后所有操作,要么全部做完,要么全部不做,不可能停滞在中间环节.事务执行过程中出错,会回滚到事务开始前的状态,所有的操作就像没有 ...

  4. 关于INTEL FPGA设计工具DSP Builder

    一段时间以来,MathWorks一直主张使用Matlab和Simulink开发工具进行基于模型的设计,因为好的设计技术使您能够在更短的时间内开发更高质量的复杂软件.基于模块的设计采用了数学和可视化的方 ...

  5. DomHelper

    public class DomHelper { public static ArrayList<Person> queryXML(Context context) { ArrayList ...

  6. java代码---------打印正三角形

    总结:手打一遍 public class aaa{ public static void main(String []args){ for(int i=1;i<10;i++){ for(int ...

  7. Html5 input日期时间输入类型标签赋值 正确的格式应该是value="2014-03-15T08:00"

    自己也亲测了!T在php的date函数中格式化后是CST   所以不能写成date('Y-m-dTH:i:s',time()) 得把把年月日和时间用date函数分别格式化  再用大写T分割开  放在v ...

  8. 3dmax卡通渲染插件pencil+渲染线框

    转自:http://www.cr173.com/soft/179512.html http://www.psoft.co.jp/jp/ 官网和YTB有 2代的视频教程,平均每个2分钟长,无解说,是日文 ...

  9. 003:MySQL账号创建授权以及Workbench

    目录 一. 权限管理 1."用户 + IP"的概念 2. 用户权限管理 3. 基本操作 4. 撤销权限 5.授权和创建用户 二. MySQL模拟角色 三. Workbench与Ut ...

  10. 解决: Project facet Java version 1.8 is not supported

    背景 从别处Import一个Java project之后,Eclipse提示“Project facet Java version 1.8 is not supported”. 分析 从错误的描述来看 ...