图论:Gale-Shapley算法
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算法的更多相关文章
- Stable Matching 稳定匹配 婚姻算法 shapley 算法
作者:jostree 转载请注明出处 http://www.cnblogs.com/jostree/p/4051286.html 稳定匹配问题:有N男N女,每个人对于异性都一个排名,先需要得到一种稳 ...
- 图论(floyd算法):NOI2007 社交网络
[NOI2007] 社交网络 ★★ 输入文件:network1.in 输出文件:network1.out 简单对比 时间限制:1 s 内存限制:128 MB [问题描述] 在社交网络( ...
- 图论之Dijkstra算法
Dijkstra算法是图论中经典的最短路径算法之一,主要用于解决单源最短路径问题. 单源最短路径问题,即求某个源节点到其他各个节点的最短路径. Dijkstra算法采用了贪心算法的思想,如图求1号节点 ...
- 图论(二分图,KM算法):HDU 3488 Tour
Tour Time Limit: 3000/1000 MS (Java/Others) Memory Limit: 65535/65535 K (Java/Others)Total Submis ...
- 图论——最短路径 Dijkstra算法、Floyd算法
1.弗洛伊德算法(Floyd) 弗洛伊算法核心就是三重循环,M [ j ] [ k ] 表示从 j 到 k 的路径,而 i 表示当前 j 到 k 可以借助的点:红色部分表示,如果 j 到 i ,i 到 ...
- 图论:Dinic算法
解决最大流问题我搜到了一堆的算法:EK算法.FF算法.Dinic算法.SAP算法.ISAP算法 然而并没有什么鸟用 掌握最常见的Dinic就够了,据说极限优化的ISAP比Dinic更快一些..我当不知 ...
- 图论:Stoer-Wagner算法
利用Stoer-Wagner算法求无向图最小割 直接给出算法描述和过程实现: 算法步骤: . 设最小割cut=INF, 任选一个点s到集合A中, 定义W(A, p)为A中的所有点到A外一点p的权总和. ...
- 图论:KM算法
如果,将求二分图的最大匹配的所有匹配边的权重看做1 那么用匈牙利算法求二分图的最大匹配的问题也可以看成求二分图的最大权匹配 如果边权是特例,我们就要使用KM算法来做了 这个算法其实还是比较难的,会用就 ...
- 图论——Dijkstra+prim算法涉及到的优先队列(二叉堆)
[0]README 0.1)为什么有这篇文章?因为 Dijkstra算法的优先队列实现 涉及到了一种新的数据结构,即优先队列(二叉堆)的操作需要更改以适应这种新的数据结构,我们暂且吧它定义为Dista ...
随机推荐
- js 邮箱和手机号码验证
<!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.0 Transitional//EN" "http://www.w3.org/ ...
- python os模块atime ,ctime,mtime意义
ython的os.stat中主要的时间信息有三个:st_mtime,st_atime,st_ctime. 1.st_mtime:time of last modification 最后一 ...
- 「暑期训练」「基础DP」 Monkey and Banana (HDU-1069)
题意与分析 给定立方体(个数不限),求最多能堆叠(堆叠要求上方的方块严格小于下方方块)的高度. 表面上个数不限,问题是堆叠的要求决定了每个方块最多可以使用三次.然后就是对3n" role=& ...
- Ubuntu-C++环境设置
在学习C++,顺便想熟悉一下Linux下开发 所以就开始搭建Linux环境 第一步就是下载虚拟机和Ubuntu 虚拟机 vm 12.1 Ubuntu 16 VM安装省略 Ubuntu安装省略 下面是我 ...
- 第二篇 Python初识别及变量名定义规范
第一个Python程序 可以打开notepad或者其他文本编辑器,输入:print("Hello Python!"),将文件保存到任意盘符下,后缀名是 .py 两种python程 ...
- Uniy 组件式泛型单例模式
我们知道,在Unity中,所有对象脚本都必须继承MonoBehavior脚本,才能使用Unity内置的脚本功能; 通常我们可以用静态类来取代单例模式,但是静态类方法的缺点是,它们必须继承最底层的类-- ...
- 2015年开源前端框架盘点TOP20
2015年,榜单根据github上star数作为排名依据.(榜单中大部分为组件式框架, react.Angular等基础框架不在此篇讨论) 1.Bootstrap 类别/语言:HTML.CSS.Jav ...
- linux备忘录-shell脚本
知识 shell执行方式 shell执行方式有 通过source或. 在现在的bash环境中执行脚本 变量等会保持 通过bash shell.sh或sh shell.sh 使用一个新的bash环境执行 ...
- windows下连接hadoop运行eclipse报错Permission denied:
这是权限问题,试了一下同时也不能在hdfs创建文件夹. 解决: 修改如下hadoop的配置文件:etc/hadoop/hdfs-site.xml,如没有的话可以添加上. <property> ...
- c#程序中的AssemblyInfo.cs
在asp.net中有一个配置文件AssemblyInfo.cs主要用来设定生成的有关程序集的常规信息dll文件的一些参数,下面是默认的AssemblyInfo.cs文件的内容具体介绍 //是否符合公共 ...