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. [Hbase]hbase命令行基本操作

    -进入hbase shell hbase shell - 帮助help help - 查看hbase versionversion - 查看hbase 状态 status - 创建表create 't ...

  2. JDBC剖析篇(1):java中的Class.forName()

    一.Class.forName() 在Java中我们一般用下面这样的语句来连接数据库(以MySQL为例) Class.forName("com.mysql.jdbc.Driver" ...

  3. 「日常训练」「小专题·图论」Domino Effect(1-5)

    题意 分析 这题几乎就是一条dijkstra的问题.但是,如何考虑倒在中间? 要意识到这题求什么:单源最短路的最大值.那么有没有更大的?倒在中间有可能会使它更大. 但是要注意一个问题:不要把不存在的边 ...

  4. ipfs补充命令

    ipfs cat之后 将文件保存在指定的路径下 添加都文件夹下面 ipfs files cp /ipfs/QmSkyNME8YqndkNq7ovKphpYwjk2hEQ61P1pjSckqLP6zt ...

  5. Python 并发编程:PoolExecutor 篇

    个人笔记,如有疏漏,还请指正. 使用多线程(threading)和多进程(multiprocessing)完成常规的并发需求,在启动的时候 start.join 等步骤不能省,复杂的需要还要用 1-2 ...

  6. BZOJ 3597 SCOI2014 方伯伯送椰子 网络流分析+SPFA

    原题链接:http://www.lydsy.com/JudgeOnline/problem.php?id=3597 Description 四川的方伯伯为了致富,决定引进海南的椰子树.方伯伯的椰子园十 ...

  7. POJ 3860 Fruit Weights(数学+最长路径 or 最短路径)

    Description Have you ever thought about comparing the weight of fruits? That’s what you should do in ...

  8. Alpha项目冲刺(团队作业5)

    团队成员 组 员 学号 朱世杰 211414141 曹晔宁 211306302 一.冲刺(7次 Scrum) [Alpha版本]冲刺阶段--Day 1 [Alpha版本]冲刺阶段--Day 2 [Al ...

  9. Java 多态方法构造器执行方法

    我们参考下面这个例子: 读者可以提前考虑一下,这段程序的输出会是什么. public class Polymorphism { /** * 创建一个类A * 该类中有一个方法draw,以及一个构造方法 ...

  10. mysql 查询表的字段数目

    select column_name from information_schema.`COLUMNS` where TABLE_NAME ='tcm_head'