Ladies' Choice UVALive - 3989 稳定婚姻问题 gale_shapley算法
/**
题目: Ladies' Choice UVALive - 3989
链接:https://vjudge.net/problem/UVALive-3989
题意:稳定婚姻问题
思路:
gale_shapley算法,参考文档:https://wenku.baidu.com/view/7aa841f2fab069dc502201cb.html */ #include <iostream>
#include <cstring>
#include <cstdio>
#include <vector>
#include <cmath>
#include <queue>
using namespace std;
const int MAXN = ;
const int INF = 0x3f3f3f3f; int blove[MAXN][MAXN];///存储女生编号 排在前面的女生编号越喜欢 !!!和glove[][]是不同的。
int glove[MAXN][MAXN];///表示第i个女生对第j个男生的的好感度 数值越大越喜欢
int boy[MAXN];///男生当前选择的女生。如果为-1,表示还没有选择。
int girl[MAXN];///女生当前选择的男生。如果为-1,表示还没有选择。
int boyrank[MAXN];///维护男生最中意的女生编号(排除已经拒绝他的女生之后)初始为1表示最喜欢最前面的那一个。
int N; void gale_shapley()///稳定婚姻问题 男生主动找女生 男生找的是最喜欢的,女生找的是稳定的最差的。交换数据可以反之。
{
memset(girl, -, sizeof girl);
memset(boy, -, sizeof boy);
for(int i = ; i <= N; i++) boyrank[i] = ;
int cnt = ;
while(cnt<N){///当cnt==N表示N个男生都选好了。
cnt = ;
for(int i = ; i <= N; i++){///所有男生向自己最中意的女生表白。
if(boy[i]!=-){
cnt++;
continue;///该男生已经选好了。暂时不用再选。
} int bestgirl = blove[i][boyrank[i]]; if(girl[bestgirl]==-){///该女生没有选择别人。
girl[bestgirl] = i;
boy[i] = bestgirl;
}else
{
if(glove[bestgirl][i]>glove[bestgirl][girl[bestgirl]]){
boyrank[girl[bestgirl]]++;///该女生找到更好的,被抛弃的男的要重新选择。更新男生最中意的女生。
boy[girl[bestgirl]] = -;///被抛弃的男生没有选择的女生了。
girl[bestgirl] = i;
boy[i] = bestgirl;
}else///女生坚持自己已经选过的,当前男生被拒绝。
{
boyrank[i]++;
}
}
}
}
}
int main()
{
int T, n;
cin>>T;
while(T--)
{
scanf("%d",&n);
N = n;
int x;
for(int i = ; i <= N; i++){
for(int j = ; j <= N; j++){
scanf("%d",&x);
blove[i][j] = x;
}
}
for(int i = ; i <= N; i++){
for(int j = ; j <= N; j++){
scanf("%d",&x);
glove[i][x] = N-j;
}
}
gale_shapley();
for(int i = ; i <= N; i++){
printf("%d\n",boy[i]);
}
if(T>){
printf("\n");
}
}
return ;
}
模板:
const int MAXN = ;
const int INF = 0x3f3f3f3f; int blove[MAXN][MAXN];///存储女生编号 排在前面的女生编号越喜欢 !!!和glove[][]是不同的。
int glove[MAXN][MAXN];///表示第i个女生对第j个男生的的好感度 数值越大越喜欢
int boy[MAXN];///男生当前选择的女生编号。如果为-1,表示还没有选择。
int girl[MAXN];///女生当前选择的男生。如果为-1,表示还没有选择。
int boyrank[MAXN];///维护男生最中意的女生编号(排除已经拒绝他的女生之后)初始为1表示最喜欢最前面的那一个。
int N; void gale_shapley()///稳定婚姻问题 男生主动找女生 男生找的是最喜欢的,女生找的是稳定的最差的。交换数据可以反之。
{
memset(girl, -, sizeof girl);
memset(boy, -, sizeof boy);
for(int i = ; i <= N; i++) boyrank[i] = ;
int cnt = ;
while(cnt<N){///当cnt==N表示N个男生都选好了。
cnt = ;
for(int i = ; i <= N; i++){///所有男生向自己最中意的女生表白。
if(boy[i]!=-){
cnt++;
continue;///该男生已经选好了。暂时不用再选。
} int bestgirl = blove[i][boyrank[i]]; if(girl[bestgirl]==-){///该女生没有选择别人。
girl[bestgirl] = i;
boy[i] = bestgirl;
}else
{
if(glove[bestgirl][i]>glove[bestgirl][girl[bestgirl]]){
boyrank[girl[bestgirl]]++;///该女生找到更好的,被抛弃的男的要重新选择。更新男生最中意的女生。
boy[girl[bestgirl]] = -;///被抛弃的男生没有选择的女生了。
girl[bestgirl] = i;
boy[i] = bestgirl;
}else///女生坚持自己已经选过的,当前男生被拒绝。
{
boyrank[i]++;
}
}
}
}
}
Ladies' Choice UVALive - 3989 稳定婚姻问题 gale_shapley算法的更多相关文章
- 训练指南 UVALive - 3989(稳定婚姻问题)
ayout: post title: 训练指南 UVALive - 3989(稳定婚姻问题) author: "luowentaoaa" catalog: true mathjax ...
- 【UVAlive 3989】 Ladies' Choice (稳定婚姻问题)
Ladies' Choice Teenagers from the local high school have asked you to help them with the organizatio ...
- LA 3989 - Ladies' Choice 稳定婚姻问题
https://icpcarchive.ecs.baylor.edu/index.php?option=com_onlinejudge&Itemid=8&page=show_probl ...
- UVALive 3989 Ladies' Choice
经典的稳定婚姻匹配问题 UVALive - 3989 Ladies' Choice Time Limit: 6000MS Memory Limit: Unknown 64bit IO Format: ...
- UVALive 3989 Ladies' Choice
Ladies' Choice Time Limit: 6000ms Memory Limit: 131072KB This problem will be judged on UVALive. Ori ...
- UVA 1175 Ladies' Choice 稳定婚姻问题
题目链接: 题目 Ladies' Choice Time Limit: 6000MS Memory Limit: Unknown 64bit IO Format: %lld & %llu 问题 ...
- UVALive-3989 Ladies' Choice (稳定婚姻问题)
题目大意:稳定婚姻问题.... 题目分析:模板题. 代码如下: # include<iostream> # include<cstdio> # include<queue ...
- 【LA 3989 训练指南】女士的选择 【稳定婚姻问题】
我们先来学一下稳定婚姻问题 什么是稳定婚姻问题? 有n个女士和n个男士,他们要一一进行配对.每个男士心中对这n个女士都有一个排名,同理,每个女士心里对n个男性也有一个排名.我们要做的是,在他们配对完成 ...
- UVA 1175 - Ladies' Choice
1175 - Ladies' Choice 链接 稳定婚姻问题. 代码: #include<bits/stdc++.h> using namespace std; typedef long ...
随机推荐
- hdoj-1301-Jungle Roads【最小生成树】
Jungle Roads Time Limit: 2000/1000 MS (Java/Others) Memory Limit: 65536/32768 K (Java/Others) Total ...
- (转)scala apply方法 笔记
在akka源码中有这样一个Cluster类. 使用方法是这样的:val cluster = Cluster(context.system); 作为scala菜鸟的我,并没有找到Cluster(syst ...
- dubbo-monitor安装监控中心,管理控制台安装
一.安装监控中心 1.创建安装目录 2.解压 上传文件解压文件 解压 3.修改配置文件 4.启动 如果一直出现点.只需要加大内存即可,内存至少大于1024,然后reboot重启 5.测试 二.安装管理 ...
- python fabric使用 http://fabric-chs.readthedocs.io/zh_CN/chs/tutorial.html
fab -u username -p password -H hostname -P -- cmd 或root@'hostname' -H多个主机是引号用逗号隔开 -P异步
- Hibernate关系映射(注解)
1.类级别注解 @Entity 映射实体类 @Table 映射数句库表 @Entity(name="tableName") - 必须,注解将一个类声明为一个实体bea ...
- 算法笔记_104:蓝桥杯练习 算法提高 新建Microsoft Word文档(Java)
目录 1 问题描述 2 解决方案 1 问题描述 问题描述 L正在出题,新建了一个word文档,想不好取什么名字,身旁一人惊问:“你出的题目叫<新建Microsoft Word文档>吗? ...
- MVC总结--数据传递
View->Controller 1.传统方式,Get方式提交.在Controller中获得client请求: string Name = Request["name"]; ...
- centos7 install flash player
1.在 https://get.adobe.com/cn/flashplayer/ 上选择需要下载版本---> ( YUM,适用于Linux (YUM) ); 2.进入root权限后,进入你的下 ...
- struts result动态结果集 带参数的结果集
<?xml version="1.0" encoding="UTF-8" ?> <!DOCTYPE struts PUBLIC &qu ...
- Sybase数据库应用系统调优的五大领域
Sybase数据库应用系统调优的五大领域 2011/3/14/13:49来源:慧聪it网 本 文以“某大型商业银行的网上银行系统”这一很具有典型意义的企业级大型Sybase数据库应用系统为例,涉及了数 ...