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

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

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

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

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

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

 1 #include<cstdio>
 2 #include<algorithm>
 3 #include<cstring>
 4 #include<queue>
 5 using namespace std;
 6 const int maxn=35;
 7 int n;
 8 int ml[maxn][maxn],fl[maxn][maxn],mc[maxn],fc[maxn];
 9 int mn[maxn],fn[maxn];
10 queue<int> q;  //没有配对的男士
11 int main()
12 {
13     int T;
14     char s[maxn];
15     scanf("%d",&T);
16     while(T--)
17     {
18         scanf("%d",&n);
19         //读入男士的名字,初始化都没有配对
20         for(int i=0;i<n;i++)
21         {
22             scanf("%s",s);
23             mn[i]=s[0]-'a';
24             q.push(mn[i]);
25         }
26         //将名字排序
27         sort(mn,mn+n);
28         for(int i=0;i<n;i++)
29         {
30             scanf("%s",s);
31             fn[i]=s[0]-'A';
32         }
33         //男士对女士的印象
34         for(int i=0;i<n;i++)
35         {
36             scanf("%s",s);
37             for(int j=0;j<n;j++)
38                 ml[i][j]=s[j+2]-'A';
39         }
40         //女士对男士的打分,n号为初始对象
41         for(int i=0;i<n;i++)
42         {
43             scanf("%s",s);
44             for(int j=0;j<n;j++)
45                 fl[i][s[j+2]-'a']=n-j;
46             fl[i][n]=0;
47         }
48         //一开始男士的期望都是最喜欢的女士
49         memset(mc,0,sizeof(mc));
50         //女士先初始化一个对象
51         for(int i=0;i<n;i++)
52             fc[i]=n;
53             while(!q.empty())
54             {
55                 //h=h%maxn+1;
56                 //找出一个没有配对的男士
57                 int m=q.front();
58                 //男士心怡的女士
59                 int fm=ml[m][mc[m]];
60                 //如果当前男士比原来的男友好
61                 if(fl[fm][m]>fl[fm][fc[fm]])
62                 {
63                     //脱单
64                     q.pop();
65                     //否则考虑下一个对象
66                     if(fc[fm]!=n)
67                     {
68                         q.push(fc[fm]);
69                         mc[fc[fm]]++;
70                     }
71                     //当前男友为这位男士
72                     fc[fm]=m;
73                 }
74                 else mc[m]++;  //如果女士拒绝,考虑下一个对象
75             }
76             for(int i=0;i<n;i++)
77                 printf("%c %c\n",mn[i]+'a',ml[mn[i]][mc[mn[i]]]+'A');
78             if(T) puts("");
79     }
80     return 0;
81 }

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

转载于:https://www.cnblogs.com/aininot260/p/9447816.html

图论:Gale-Shapley算法相关推荐

  1. 稳定婚姻问题:Gale–Shapley算法

    (一)问题的引出 在组合数学.经济学.计算机科学中,稳定婚姻问题(英语:stable marriage problem,简称SMP)又称为稳定配对问题(stable matching problem) ...

  2. 图论模型Floyd算法

    图论模型Floyd算法 一.简介 二.MATLAB执行代码 一.简介 二.MATLAB执行代码 tulun2.m a= [ 0,50,inf,40,25,10;50,0,15,20,inf,25;in ...

  3. 图论——networkx——最短路径算法篇

    NetworkX系列教程(10)-算法之一:最短路径问题 小书匠Graph图论 重头戏部分来了,写到这里我感觉得仔细认真点了,可能在NetworkX中,实现某些算法就一句话的事,但是这个算法是做什么的 ...

  4. 【阿良的算法之路】图论最短路算法模板

    图论: [阿良的算法之路]图论最短路算法模板 [模板]dirjkstra单源最短路径 [模板]Bellman-Ford多源最短路 [模板]Spfa求最短路 [模板]Spfa判断负环 [模板]Floya ...

  5. 图论的其他算法(●—●) -- HL集训回校复习day2

    我自定义的目录标题●-● 欧拉回路和欧拉路 概念: 例题: Hierholzer算法 代码 拓扑排序 代码 差分约束系统 推广 例题 欧拉回路和欧拉路 概念: { 简单的说如果一个图存在一笔画(一笔能 ...

  6. 数学建模:图论模型-Floyd算法

    紧接着来介绍一下图论模型的另一种算法--Floyd算法,然后介绍其在MATLAB中的实现方法: Floyd算法:Floyd算法是一个经典的动态规划算法.用通俗的语言来描述的话,首先我们的目标是寻找从点 ...

  7. 【WUSTOJ 图论之基本算法:SPFA】 1013: 香甜的黄油

    题目描述: 1013: 香甜的黄油 农夫John发现做出全威斯康辛州最甜的黄油的方法:糖.把糖放在一片牧场上,他知道N(1<=N<=500)只奶牛会过来舔它,这样就能做出能卖好价钱的超甜黄 ...

  8. 图论-路径优化算法总结

    知乎主页https://www.zhihu.com/people/shuang-shou-cha-dai-53 目录 1:Dijkstra算法 1.1:算法思想 1.2:算法步骤 1.3:代码演示 1 ...

  9. matlab图论模型和算法

    图论算法简介 图论起源于哥尼斯堡七桥问题 要求从以点出发走过所有的路径. 图论 (Graph theory) 以图为研究对象, 研究顶点和边组成的图形的数学理论和方法. 图论中的图是由若干给定的顶点及 ...

  10. 图论:Dinic算法

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

最新文章

  1. GEMM与AutoKernel算子优化
  2. YOLO v3解析与实现
  3. RabbitMQ快速入门--消息模型介绍
  4. POJ - 2342 Anniversary party(树形dp入门)
  5. mina mysql_Mina学习笔记(二)
  6. 数组排序最小复杂度_进行排序的最小缺失数
  7. centos7下python3与python2共存并且开启py3虚拟环境
  8. 26 | 红黑树(下):掌握这些技巧,你也可以实现一个红黑树
  9. 微信小程序 全局共享数据
  10. kaggle—HousePrice房价预测项目实战
  11. Android Audio BSP工程师 需要清楚的基本知识点
  12. CentOS 关闭蜂鸣器声音
  13. python-学生管理系统--3删除学生信息功能
  14. Windows端口扫描关闭工具
  15. sqlserver中能用when_sqlserver中casewhen用法小结
  16. 博客群建软件-Google会认为哪些网站是作弊网站?
  17. 计算机任务管理器无法响应,Win7系统电脑在任务管理器中关闭进程时总是未响应的解决方法...
  18. ROS URDF模型解析成KDL Tree
  19. 汤家凤_定积分的计算
  20. 笔记本同时接入无线(外网)和有线(内网)

热门文章

  1. OpenCV-图像处理(05、图像混合)
  2. python中的作用域_python中作用域
  3. 链表的基本操作(单链表)
  4. opc服务器的时间怎么修改,OPC服务器是否允许在其逻辑中使用源时间戳?(Is OPC server allowed to use source timestamp in its logic?)...
  5. java静态方法没有this,super与this无法用在static方法中
  6. 你写的api接口代码真是_百度AI接口之JavaAPI方式调用示例代码[持续完善中]
  7. 翻译: TensorFlow 2.0 中的符号和命令式 API 是什么?
  8. Charles 导出所有request, response, cookie, 导出为HTTP Archive .har
  9. 1 1 2 2 3 ...java_java 接收一个键盘输入的整数,计算1-1/2!+1/3!-1/4!.....1/n!
  10. PaddlePaddle Transformer encoder 源码解析 v1.7