Gale-Shapley算法又叫做延迟认可算法,它可以解决这么一个问题

一共有N位男士和N位女士

每位男士对每位女士都有一个好感度,让他们结合成为N对夫妻,要求男士优先表白,最后问结合情况

第一轮,每个男人都选择自己名单上排在首位的女人,并向她表白。
这种时候会出现两种情况:
()该女士还没有被男生追求过,则该女士接受该男生的请求。
()若该女生已经接受过其他男生的追求,那么该女生会将该男士与她的现任男友进行比较,若更喜欢她的男友,那么拒绝这个人的追求,否则,抛弃现任……
第一轮结束后,有些男人已经有女朋友了,有些男人仍然是单身。
在第二轮追女行动中,每个单身男都从所有还没拒绝过他的女孩中选出自己最中意的那一个,并向她表白,不管她现在是否是单身。
这种时候还是会遇到上面所说的两种情况,还是同样的解决方案。直到所有人都不在是单身。

以上给出了算法的描述,下面直接给出代码,题目是POJ3487

由于这个问题没有太大变式直接套模板就好了,如果要求女士优先,那就把男女身份互换然后再套用这个模板就好了

 #include<cstdio>
#include<algorithm>
#include<cstring>
#include<queue>
using namespace std;
const int maxn=;
int n;
int ml[maxn][maxn],fl[maxn][maxn],mc[maxn],fc[maxn];
int mn[maxn],fn[maxn];
queue<int> q; //没有配对的男士
int main()
{
int T;
char s[maxn];
scanf("%d",&T);
while(T--)
{
scanf("%d",&n);
//读入男士的名字,初始化都没有配对
for(int i=;i<n;i++)
{
scanf("%s",s);
mn[i]=s[]-'a';
q.push(mn[i]);
}
//将名字排序
sort(mn,mn+n);
for(int i=;i<n;i++)
{
scanf("%s",s);
fn[i]=s[]-'A';
}
//男士对女士的印象
for(int i=;i<n;i++)
{
scanf("%s",s);
for(int j=;j<n;j++)
ml[i][j]=s[j+]-'A';
}
//女士对男士的打分,n号为初始对象
for(int i=;i<n;i++)
{
scanf("%s",s);
for(int j=;j<n;j++)
fl[i][s[j+]-'a']=n-j;
fl[i][n]=;
}
//一开始男士的期望都是最喜欢的女士
memset(mc,,sizeof(mc));
//女士先初始化一个对象
for(int i=;i<n;i++)
fc[i]=n;
while(!q.empty())
{
//h=h%maxn+1;
//找出一个没有配对的男士
int m=q.front();
//男士心怡的女士
int fm=ml[m][mc[m]];
//如果当前男士比原来的男友好
if(fl[fm][m]>fl[fm][fc[fm]])
{
//脱单
q.pop();
//否则考虑下一个对象
if(fc[fm]!=n)
{
q.push(fc[fm]);
mc[fc[fm]]++;
}
//当前男友为这位男士
fc[fm]=m;
}
else mc[m]++; //如果女士拒绝,考虑下一个对象
}
for(int i=;i<n;i++)
printf("%c %c\n",mn[i]+'a',ml[mn[i]][mc[mn[i]]]+'A');
if(T) puts("");
}
return ;
}

另外记住一点如果队列不是特别正常的队列不要手写,还是STL比较稳

图论:Gale-Shapley算法的更多相关文章

  1. Stable Matching 稳定匹配 婚姻算法 shapley 算法

    作者:jostree  转载请注明出处 http://www.cnblogs.com/jostree/p/4051286.html 稳定匹配问题:有N男N女,每个人对于异性都一个排名,先需要得到一种稳 ...

  2. 图论(floyd算法):NOI2007 社交网络

    [NOI2007] 社交网络 ★★   输入文件:network1.in   输出文件:network1.out   简单对比 时间限制:1 s   内存限制:128 MB [问题描述] 在社交网络( ...

  3. 图论之Dijkstra算法

    Dijkstra算法是图论中经典的最短路径算法之一,主要用于解决单源最短路径问题. 单源最短路径问题,即求某个源节点到其他各个节点的最短路径. Dijkstra算法采用了贪心算法的思想,如图求1号节点 ...

  4. 图论(二分图,KM算法):HDU 3488 Tour

    Tour Time Limit: 3000/1000 MS (Java/Others)    Memory Limit: 65535/65535 K (Java/Others)Total Submis ...

  5. 图论——最短路径 Dijkstra算法、Floyd算法

    1.弗洛伊德算法(Floyd) 弗洛伊算法核心就是三重循环,M [ j ] [ k ] 表示从 j 到 k 的路径,而 i 表示当前 j 到 k 可以借助的点:红色部分表示,如果 j 到 i ,i 到 ...

  6. 图论:Dinic算法

    解决最大流问题我搜到了一堆的算法:EK算法.FF算法.Dinic算法.SAP算法.ISAP算法 然而并没有什么鸟用 掌握最常见的Dinic就够了,据说极限优化的ISAP比Dinic更快一些..我当不知 ...

  7. 图论:Stoer-Wagner算法

    利用Stoer-Wagner算法求无向图最小割 直接给出算法描述和过程实现: 算法步骤: . 设最小割cut=INF, 任选一个点s到集合A中, 定义W(A, p)为A中的所有点到A外一点p的权总和. ...

  8. 图论:KM算法

    如果,将求二分图的最大匹配的所有匹配边的权重看做1 那么用匈牙利算法求二分图的最大匹配的问题也可以看成求二分图的最大权匹配 如果边权是特例,我们就要使用KM算法来做了 这个算法其实还是比较难的,会用就 ...

  9. 图论——Dijkstra+prim算法涉及到的优先队列(二叉堆)

    [0]README 0.1)为什么有这篇文章?因为 Dijkstra算法的优先队列实现 涉及到了一种新的数据结构,即优先队列(二叉堆)的操作需要更改以适应这种新的数据结构,我们暂且吧它定义为Dista ...

随机推荐

  1. PRO*C 函数事例 3 -- 游标使用

    1.Oracle中的游标    Oracle使用两种游标: 显式游标和隐式游标. 不管语句返回多少条记录, Oracle为每条使用的SQL语句隐式地定义一个游标. Oracle为每个DELETE , ...

  2. error LNK2001: unresolved external symbol "public: __thiscall ControllerInterface::ControllerInterface(class QObject *)" (??0ControllerInterface@@QAE@PAVQObject@@@Z) downloadcontroller.obj

    前几天刚遇到这个问题,但是今天再碰到就又要思考怎么解决.这次特别记录一下,以防下次碰到再手足无措: 1.看到这个报错第一感觉LNK关键字,表示连接错误,这种错误有几个可以下手的点 1)函数声明和定义是 ...

  3. Qt Qwdget 汽车仪表知识点拆解3 进度条编写

    先贴上效果图,注意,没有写逻辑,都是乱动的 这篇我来说说左侧的这个进度条的实现原理,其实更简单,哈哈哈 有一个大的widget,根据素材,我放了10个label 剩下的就是写一个函数,根据数据的不同, ...

  4. 修改有数据oracle字段类型 从number转为varchar

    --修改有数据oracle字段类型 从number转为varchar--例:修改ta_sp_org_invoice表中RESCUE_PHONE字段类型,从number转为varchar --step1 ...

  5. Java IO学习--File类

    一.File类 File类具备一定的误导性,可能容易认为它指代的是文件,实际并非如此,它既能代表一个特定文件的名称,又能表示一个目录下一组文件的名称.简而言之,File类是文件或者目录路径名的抽象表示 ...

  6. TP5 急速上手 语法规则

    Tp5  规则 命名规范 目录和文件名采用‘小写+下划线’,并且以小写字母开头: 类库.函数文件统一以.php为后缀: 类的文件名均以命名空间定义,并且命名空间的路径和类库文件所在路径一致(包括大小写 ...

  7. Halcon环境搭建

    1.Visual Studio 2017安装教程 2.Qt5.9安装教程 3.VS2017中Qt插件安装教程

  8. C#故事

    C# 在腾讯的发展 <先定个小目标, 使用C# 开发的千万级应用> Xamarin 携程使用.Net技术 分布式高并发redis MQ dubbo kafka zookeeper

  9. SIP初步

    http://blog.sina.com.cn/s/blog_6b10255301012db7.html 1.什么是SIP SIP(会话发起协议)属于IP应用层协议,用于在IP网上为用户提供会话应用. ...

  10. SQL Server 监测语句

    qs.creation_time, last_execution_time, total_physical_reads, total_logical_reads, total_logical_writ ...