1. http://acm.hdu.edu.cn/showproblem.php?pid=1914
  2.  
  3. 思路:Gale-Shapley算法。算法过程是男士不停地求婚,女士不停地拒绝。在每一轮中,每个尚未订婚的男士在他还没有求过婚的女士中选一个自己最喜欢的求婚(不管她有没有订婚)。然后每个女士在向她求婚的人之中选择她最喜欢的一个订婚,并且拒绝其他人。注意,这些向她求婚的人中包含她的未婚夫,因此她可以选择另一个自己更喜欢的人订婚,而抛弃自己的现任未婚夫。这个算法的结果是使男士都能娶到自己有可能娶到的最好的妻子,所以是对男士的理想配对。
  1. #include<iostream>
  2. #include<cstdio>
  3. #include<cmath>
  4. #include<cstdlib>
  5. #include<algorithm>
  6. #include<cstring>
  7. #include<string>
  8. #include<vector>
  9. #include<map>
  10. #include<set>
  11. #include<queue>
  12. using namespace std;
  13. struct male
  14. {
  15. int f,rev[],tag;
  16. } m[];
  17. struct female
  18. {
  19. int tag,temp,val,wait[];
  20. } f[];
  21. int _,n,t,k,mf[][],fm[][];
  22. char ch[];
  23. bool ok()
  24. {
  25. int i;
  26. for (i=;i<=;i++)
  27. if (m[i].f==&&m[i].tag>) return true;
  28. return false;
  29. }
  30. int main()
  31. {
  32. scanf("%d",&_);
  33. while (_--)
  34. {
  35. scanf("%d",&n);
  36. int i,j;
  37. for (i=;i<=;i++)
  38. {
  39. f[i].tag=;
  40. m[i].tag=;
  41. }
  42. for (i=;i<=n;i++)
  43. {
  44. scanf("%s",ch);
  45. t=ch[]-'a'+;
  46. m[t].f=;
  47. m[t].tag=t;
  48. memset(m[t].rev,,sizeof(m[t].rev));
  49. }
  50. for (i=;i<=n;i++)
  51. {
  52. scanf("%s",ch);
  53. t=ch[]-'A'+;
  54. f[t].tag=t;
  55. f[t].temp=;
  56. f[t].val=;
  57. memset(f[t].wait,,sizeof(f[i].wait));
  58. }
  59. for (i=;i<=n;i++)
  60. {
  61. scanf("%s",ch);
  62. t=ch[]-'a'+;
  63. for (j=;j<=n+;j++)
  64. mf[t][j-]=ch[j]-'A'+;
  65. }
  66. for (i=;i<=n;i++)
  67. {
  68. //cout<<1;
  69. scanf("%s",ch);
  70. t=ch[]-'A'+;
  71. for (j=;j<=n+;j++)
  72. fm[t][j-]=ch[j]-'a'+;
  73. }
  74. //cout<<"hhhhhhh"<<endl;
  75. while (ok())
  76. {
  77. for (i=;i<=;i++)
  78. {
  79. if (m[i].f==&&m[i].tag>)
  80. {
  81. for (j=;j<=n;j++)
  82. {
  83. t=mf[i][j];
  84. if (m[i].rev[t]==)
  85. {
  86. m[i].rev[t]=;
  87. m[i].f=;
  88. k=++f[t].wait[];
  89. f[t].wait[k]=i;
  90. break;
  91. }
  92. }
  93. }
  94. }
  95. for (i=;i<=;i++)
  96. {
  97. if (f[i].tag>)
  98. {
  99. for (j=;j<=f[i].wait[];j++)
  100. {
  101. t=f[i].wait[j];
  102. for (k=;k<=n;k++)
  103. if (fm[i][k]==t) break;
  104. if (f[i].val>k)
  105. {
  106. m[f[i].temp].f=;
  107. f[i].temp=t;
  108. f[i].val=k;
  109. }
  110. else m[t].f=;
  111. }
  112. f[i].wait[]=;
  113. }
  114. }
  115. }
  116. int out[];
  117. memset(out,,sizeof(out));
  118. for (i=;i<=;i++)
  119. if (f[i].tag>)
  120. {
  121. j=f[i].temp;
  122. out[j]=i;
  123. }
  124. for (i=;i<=;i++)
  125. if (out[i]) printf("%c %c\n",i-+'a',out[i]-+'A');
  126. if (_) printf("\n");
  127. }
  128. return ;
  129. }

HDU1914(稳定婚姻)的更多相关文章

  1. hdu1914 稳定婚姻问题

               稳定婚姻问题就是给你n个男的,n个女的,然后给你每个男生中女生的排名,和女生心目中男生的排名,然后让你匹配成n对,使婚姻稳定,假如a和b匹配,c和d匹配,如果a认为d比b好,同时 ...

  2. HDU1914 稳定婚姻匹配

    The Stable Marriage Problem Time Limit: 5000/1000 MS (Java/Others)    Memory Limit: 65535/32768 K (J ...

  3. 【HDU1914 The Stable Marriage Problem】稳定婚姻问题

    题目链接:http://acm.hdu.edu.cn/showproblem.php?pid=1914 题目大意:问题大概是这样:有一个社团里有n个女生和n个男生,每位女生按照她的偏爱程度将男生排序, ...

  4. UVA 1175 Ladies' Choice 稳定婚姻问题

    题目链接: 题目 Ladies' Choice Time Limit: 6000MS Memory Limit: Unknown 64bit IO Format: %lld & %llu 问题 ...

  5. BZOJ2140: 稳定婚姻

    题解: 题意就是求二分图的必须边. 我们有结论: 在残量网络上跑tarjan,对于一条边(u,v) 如果该边满流||scc[u]==scc[v],那么该边是可行边. 因为如果scc[u]==scc[v ...

  6. 【POJ 3487】 The Stable Marriage Problem (稳定婚姻问题)

    The Stable Marriage Problem   Description The stable marriage problem consists of matching members o ...

  7. 【UVAlive 3989】 Ladies' Choice (稳定婚姻问题)

    Ladies' Choice Teenagers from the local high school have asked you to help them with the organizatio ...

  8. 【稳定婚姻问题】【HDU1435】【Stable Match】

    2015/7/1 19:48 题意:给一个带权二分图  求稳定匹配 稳定的意义是对于某2个匹配,比如,( a ---- 1) ,(b----2) , 如果 (a,2)<(a,1) 且(2,a)& ...

  9. poj 3487 稳定婚姻

    /** 稳定婚姻:男生不停的求婚,女生不停地拒绝 **/ #include <iostream> #include <queue> #include <cstdio> ...

  10. 稳定婚姻问题和Gale-Shapley算法(转)

    什么是算法?每当有人问作者这样的问题时,他总会引用这个例子:假如你是一个媒人,有若干个单身男子登门求助,还有同样多的单身女子也前来征婚.如果你已经知道这些女孩儿在每个男孩儿心目中的排名,以及男孩儿们在 ...

随机推荐

  1. c++ memset函数

    函数名称:memset 函数所需头文件:#include<cstring> 函数作用:内存赋值函数,用来给某一块内存空间进行赋值的. 函数结构:memset(变量,一个数字,一个数字)  ...

  2. Uva 10766 Organising the Organisation (Matrix_tree 生成树计数)

    题目描述: 一个由n个部门组成的公司现在需要分层,但是由于员工间的一些小小矛盾,使得他们并不愿意做上下级,问在满足他们要求以后有多少种分层的方案数? 解题思路: 生成树计数模板题,建立Kirchhof ...

  3. 思维题 HDOJ 5288 OO’s Sequence

    题目传送门 /* 定义两个数组,l[i]和r[i]表示第i个数左侧右侧接近它且值是a[i]因子的位置, 第i个数被选择后贡献的值是(r[i]-i)*(i-l[i]),每个数都枚举它的因子,更新l[i] ...

  4. C#模拟百度登录并到指定网站评论回帖(五)

    前面的四篇已经说完了全部的模拟百度登录,接下来就是到指定的网站去发表评论,当然你也可能是获取其他信息,其实这些套路都是万变不离其宗的,弄懂之后觉得像这种请求-响应获取信息的功能实在很简单(想起当初走的 ...

  5. scla-基础-函数-元组(0)

    //元组 class Demo2 extends TestCase { def test_create_^^(){ val yuana = (1,true,1.2,"c",&quo ...

  6. 常见Z纯CSS小样式合集(三角形)

    三角形 .sanjiao{ width:0px; height: 0px; overflow: hidden; border-width: 100px; border-color: transpare ...

  7. WordPress百度熊掌号页面改造(纯代码实现)

    一.粉丝关注改造 1.添加熊掌号ID声明 ID声明 <script src="//msite.baidu.com/sdk/c.js?appid=你的熊掌ID">< ...

  8. TortoiseSVN客户端不能记住用户名和密码

    TortoiseSVN客户端重新设置用户名和密码 在第一次使用TortoiseSVN从服务器CheckOut的时候,会要求输入用户名和密码,这时输入框下面有个选项是保存认证信息,如果选了这个选项,那么 ...

  9. iframe子页面让父页面跳转 parent.location.href

    if ($roleNum < 9) { echo "<script > parent.location.href='admin_login.php' </script ...

  10. Java 基础入门随笔(7) JavaSE版——面向对象定义、特征:封装、构造函数

    面向对象 面向过程:对于面向过程思想,强调的是过程(动作). 面向对象:对于面向对象思想,强调的是对象(实体). 特点: 1,面向对象就是一种常见的思想.符合人们的思考习惯.2,面向对象的出现,将复杂 ...