稳定婚姻问题(自己的总结)
稳定婚姻问题就是给你n个男的,n个女的,然后给你每个男生中女生的排名,和女生心目中男生的排名,然后让你匹配成n对,使婚姻稳定,假如a和b匹配,c和d匹配,如果a认为d比b好,同时d也认为a比c好,那么ad就有可能私奔,这样就导致了婚姻的不稳定,稳定婚姻就是找到一种解决方案让婚姻稳定
算法:
稳定婚姻的解决方法比较简单,通俗易懂,而且还容易实现,具体有没有固定的模板我不知道,没有去找,自己模拟的,在求解的过程中,我们先把所有的男生都加到队列里,队列里的就表示当前还单身的男生,每次从队列里拿出一个男生,然后从她最喜欢的女生开始匹配,如果当前的女生尝试追求过,那么就不用追求了,如果当前的女生没有伴侣,那么可以直接匹配上,如果有伴侣,那么就看看当前这个男生和女生之前的伴侣在那个女生中更喜欢谁,如果更喜欢当先的这个男生,那么当前男生就和这个女生匹配,女生之前匹配过的直接变成单身,被扔回队列,否则,继续找下一个女生,知道找到一个能匹配上的为止,就这样一直到队列空的时候,就已经全部匹配完成了。
正确性:
对于男生来说,每次都是从最喜欢的女生开始匹配的,遇到的第一个没人能抢走的并且稳定的就是自己最终伴侣,也就是说如果之前追求过的女生被别人抢走了,那么他将永远抢不会来,因为对于女生来说,第一次被男士按照自己的意愿选择之后,每次变更匹配对象都是在自己心目中更加喜欢的,所以一旦他放弃了某个男生,那么那个男生就没希望在和他匹配,这样男生是从最优的选的,保证男生不会出轨,女生每次都是在选择她的男生中选择最优的,这样也保证了女生最后没有怨言,这样的话,最后的到的婚姻就是稳定的,至于稳定婚姻,肯定会有稳定方案,这个我暂时证明不了,是看别人说的。
自己所以写的一个模板,有点难看!!!!
#include<stdio.h>
#include<string.h>
#include<queue>
#define N 30
using namespace std;
int G_b[N][N];//男孩在女孩心中的分数
int nowB[N] ,nowG[N]; //当前匹配结果
char Name_B[N] ,Name_G[N]; //记录名字
int map[N][N];//男孩喜欢的女孩的顺序
int mark[N][N];//是否尝试求婚过
int hash[200];//mark名字用的
void Marr(int n)
{
queue<int>q;
for(int i = 1 ;i <= n ;i ++)
q.push(i);
memset(nowB ,255 ,sizeof(nowB));
memset(nowG ,255 ,sizeof(nowG));
memset(mark ,0 ,sizeof(mark));
while(!q.empty())
{
int tou = q.front();
q.pop();
for(int ii = 1 ;ii <= n ;ii ++)
{
int i = map[tou][ii];
if(mark[tou][i]) continue;
mark[tou][i] = 1;
if(nowG[i] == -1)
{
nowG[i] = tou;
nowB[tou] = i;
break;
}
else
{
if(G_b[i][tou] > G_b[i][nowG[i]])
{
q.push(nowG[i]);
nowG[i] = tou;
nowB[tou] = i;
break;
}
}
}
}
}
int main ()
{
int t ,n ,i ,j;
char str[30];
scanf("%d" ,&t);
while(t--)
{
scanf("%d" ,&n);
getchar();
for(i = 1 ;i <= n ;i ++)
{
scanf("%s" ,str);
hash[str[0]] = i;
Name_B[i] = str[0];
}
for(i = 1 ;i <= n ;i ++)
{
scanf("%s" ,str);
hash[str[0]] = i;
Name_G[i] = str[0];
}
for(i = 1 ;i <= n ;i ++)
{
scanf("%s" ,str);
for(j = 2 ;j <= n + 1 ;j ++)
map[hash[str[0]]][j-1] = hash[str[j]];
}
for(i = 1 ;i <= n ;i ++)
{
scanf("%s" ,str);
for(j = 2 ;j <= n + 1 ;j ++)
G_b[hash[str[0]]][hash[str[j]]] = n - j + 2;
}
Marr(n);
for(i = 1 ;i <= n ;i ++)
printf("%c %c\n" ,Name_B[i] ,Name_G[nowB[i]]);
if(t) puts("");
}
return 0;
}
稳定婚姻问题(自己的总结)相关推荐
- 【BZOJ2140】稳定婚姻 Tarjan
[BZOJ2140]稳定婚姻 Description 我国的离婚率连续7年上升,今年的头两季,平均每天有近5000对夫妇离婚,大城市的离婚率上升最快,有研究婚姻问题的专家认为,是与简化离婚手续有关. ...
- hdu1435 稳定婚姻问题
题意: Stable Match Special Judge Problem Description Network 公司的BOSS 说现在他们公司建立的信号发射站和接收站经常出现信号发送接收不稳定的 ...
- hdu1914 稳定婚姻问题
稳定婚姻问题就是给你n个男的,n个女的,然后给你每个男生中女生的排名,和女生心目中男生的排名,然后让你匹配成n对,使婚姻稳定,假如a和b匹配,c和d匹配,如果a认为d比b好,同时 ...
- 稳定匹配问题——稳定婚姻算法设计
图片源自:美剧<How I met your mother> **** 本代码带有详细的注释,并在控制台输出时详细地说明了算法的过程,非常有助于新手理解稳定匹配问题和稳定婚姻算法的设计思路 ...
- 稳定婚姻问题:Gale–Shapley算法
(一)问题的引出 在组合数学.经济学.计算机科学中,稳定婚姻问题(英语:stable marriage problem,简称SMP)又称为稳定配对问题(stable matching problem) ...
- 【文末福利】图论算法:稳定婚姻问题,如何找到最适合自己的另一半
什么是算法? >>>> 每当有人问我这样的问题,我总会引用下面这个例子. 假如你是一个媒人,有若干名单身男子登门求助,还有同样多的单身 女子也来征婚.如果你已经知道这些女孩儿在 ...
- 图论 —— 稳定婚姻问题与延迟认可算法
[稳定婚姻问题] 1.集合 M 表示 n 个男性 2.集合 F 表示 n 个女性 3.对于每个人我们都按异性的中意程度给出一份名单(从最中意的到最不中意的) 如果没有 ,f 对 m 比对她的配偶中意的 ...
- LA 3989 - Ladies' Choice 稳定婚姻问题
https://icpcarchive.ecs.baylor.edu/index.php?option=com_onlinejudge&Itemid=8&page=show_probl ...
- hdu - 1435 Stable Match 稳定婚姻问题、Gale-Shapley算法模板
稳定婚姻的描述: 假如你是一个媒人,有若干个单身男子登门求助,还有同样多的单身女子也前来征婚.如果你已经知道这些女孩儿在每个男孩儿心目中的排名,以及男孩儿们在每个女孩儿心中的排名,你应该怎样为他们牵线 ...
最新文章
- Swift 单元测试
- PointNet++详解与代码
- 滑动关机代码bat_BAT面试算法进阶--(2) 无重复字符的最长子串(滑动法优化+ASCII码法)...
- 中国人工智能学会通讯——KS-Studio:一个知识计算引擎 1.2 知识图谱构建
- 软件测试 学习之路 CSS(一)
- 计算机原子指令,计算机体系结构——多线程(核)访存“上锁”——原子指令...
- redis 字符串类型原子性实现方案与memcached-cas原子性性能比较
- 微信小程序公测了!教你第一时间注册微信小程序
- 黑群晖数据迁移白群晖(DS 920+)
- python字符串变量替换_Python基于template实现字符串替换
- 搜狗主动提交url并反馈快照更新软件(含源码)
- java mvc demo_SpringMvcDemo 一个简单的 mvc 的 实现例子 Java Develop 259万源代码下载- www.pudn.com...
- STM8S系列基于STVD标准库外设库开发,PWM输出实现LED呼吸灯效果
- Echart3绘制世界地图连线中国城市
- Java实现 for循环输出空心的菱形 在main方法中调用printHollowRhombus()方法完成10行的空心菱形输出,其中 printHollo
- 如何在iPhone或iPad上使用控制中心
- 双硬盘(固态+机械)装双系统(win10+Ubuntu14.04)
- 安装Chrome失败
- 106-Latex矩阵过大问题
- 短距离激光测距仪方案模块