图论: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 ...
随机推荐
- PRO*C 函数事例 2 -- 数据库操作
Pro*C Oracle 的嵌入式开发,数据库处理部分最好能提取到一个模块,按照对不同数据库表的操作分成不同的.pc文件(如 DbsInstStat.pc).将此模块编译成库(c文件编译时链接此库), ...
- 引用外部静态库(.a文件)时或打包.a时,Category方法无法调用。崩溃
我的这个是MJRefresh,学习打.a包Terminating app due to uncaught exception 'NSInvalidArgumentException', reason: ...
- Unity3d工具方法小集
1.获取垂直水平方向上的输入: float moveHorizontal = Input.GetAxis("Horizontal"); float moveVertical = I ...
- 使用hibernate连接Oracle时的权限问题
在使用hibernate对象关系映射连接和创建表的时候,会涉及到很多权限问题,有些数据库管理会将权限设的很细,我们可以根据后台日志错误和异常信息作出判断. 比如下图所示这个错误(这是我在给银行投产系统 ...
- 辨析ADK&JVM&JRE&JDK&ADT
一.SDK 英文全称:Software Development Kit 中文译名:软件开发工具包 详解: 由第三方服务商提供的实现软件产品某项功能的工具包. 为了扩展软件功能或其它方面而设计出来给开发 ...
- 数据结构7——DP优化
斜率优化/单调队列优化/四边形优化
- Spring框架(依赖注入)
特点 1轻量级和侵入性低 2依赖注入和面向接口实现松耦合 3面向切面编程 减少样式代码 专有名词: 1依赖注入:对象无需自行管理依赖关系.通过系统负责协调在创建对象的第三方组件的设定,实现依赖关系自动 ...
- ArcGIS API for javascript中搜索框的使用问题
我们在开发中常常需要用搜索框去搜索地图上的某个数据,然后在地图上显示出来.这个时候我们要用到esri.dijit.Search().在设置里面的sources的时候,需要注意一点:必须要使用在线的fe ...
- SSH面试集锦——不看后悔哦!
1. 谈谈你mvc的理解 MVC是Model-View-Controler的简称.即模型-视图-控制器.MVC是一种设计模式,它强制性的把应用程序的输入.处理和输出分开. MVC中的模型 ...
- 实现AJAX跨域访问方式一
1.添加pom依赖 <dependency> <groupId>com.thetransactioncompany</groupId> <artifactId ...