稳定婚姻问题就是给你n个男的,n个女的,然后给你每个男生中女生的排名,和女生心目中男生的排名,然后让你匹配成n对,使婚姻稳定,假如a和b匹配,c和d匹配,如果a认为d比b好,同时d也认为a比c好,那么ad就有可能私奔,这样就导致了婚姻的不稳定,稳定婚姻就是找到一种解决方案让婚姻稳定

算法:

      稳定婚姻的解决方法比较简单,通俗易懂,而且还容易实现,具体有没有固定的模板我不知道,没有去找,自己模拟的,在求解的过程中,我们先把所有的男生都加到队列里,队列里的就表示当前还单身的男生,每次从队列里拿出一个男生,然后从她最喜欢的女生开始匹配,如果当前的女生尝试追求过,那么就不用追求了,如果当前的女生没有伴侣,那么可以直接匹配上,如果有伴侣,那么就看看当前这个男生和女生之前的伴侣在那个女生中更喜欢谁,如果更喜欢当先的这个男生,那么当前男生就和这个女生匹配,女生之前匹配过的直接变成单身,被扔回队列,否则,继续找下一个女生,知道找到一个能匹配上的为止,就这样一直到队列空的时候,就已经全部匹配完成了。


正确性:

        对于男生来说,每次都是从最喜欢的女生开始匹配的,遇到的第一个没人能抢走的并且稳定的就是自己最终伴侣,也就是说如果之前追求过的女生被别人抢走了,那么他将永远抢不会来,因为对于女生来说,第一次被男士按照自己的意愿选择之后,每次变更匹配对象都是在自己心目中更加喜欢的,所以一旦他放弃了某个男生,那么那个男生就没希望在和他匹配,这样男生是从最优的选的,保证男生不会出轨,女生每次都是在选择她的男生中选择最优的,这样也保证了女生最后没有怨言,这样的话,最后的到的婚姻就是稳定的,至于稳定婚姻,肯定会有稳定方案,这个我暂时证明不了.<1962年,美国数学家
David Gale 和 Lloyd Shapley是这两个人发明的方法,并且证明了稳定婚姻一定会有解>。

#include<stdio.h>

#include<string.h>

#include<queue>

#include<algorithm>

#define N 30

using namespace std;

typedef struct

{

   char a ,b;

}NODE;

NODE Ans[N];

int map[N][N] ,G_b[N][N];

int nowb[N] ,nowg[N];

char nameb[N] ,nameg[N];

int mark[N][N] ,ID[200];

bool camp(NODE a ,NODE b)

{

   return a.a < b.a;

}

void Marr(int n)

{

   queue<int>q;

   for(int i = 1 ;i <= n ;i ++)

   q.push(i);

  

   memset(mark ,0 ,sizeof(mark));

   memset(nowb ,255 ,sizeof(nowb));

   memset(nowg ,255 ,sizeof(nowg));

  

   while(!q.empty())

   {

      int xin ,tou = q.front();

      q.pop();

     

      for(int i = 1 ;i <= n ;i ++)

      {

         xin = map[tou][i];

         if(mark[tou][xin]) continue;

         mark[tou][xin] = 1;

         if(nowg[xin] == -1)

         {

            nowg[xin] = tou;

            nowb[tou] = xin;

            break;

         }

         else

         {

            if(G_b[xin][tou] > G_b[xin][nowg[xin]])

            {

               q.push(nowg[xin]);

               nowg[xin] = tou;

               nowb[tou] = xin;

               break;

            }

         }

      }

   }

   return ;

}

int main ()

{

   int t ,n ,i ,j;

   char str[30];

   scanf("%d" ,&t);

   while(t--)

   {

      scanf("%d" ,&n);

      getchar();

      for(i = 1 ;i <= n ;i ++)

      {

         scanf("%s" ,str);

         ID[str[0]] = i;

         nameb[i] = str[0];

      }

      for(i = 1 ;i <= n ;i ++)

      {

         scanf("%s" ,str);

         ID[str[0]] = i;

         nameg[i] = str[0];

      }

      for(i = 1 ;i <= n ;i ++)

      {

         scanf("%s" ,str);

         for(j = 2 ;j <= n + 1 ;j ++)

         map[ID[str[0]]][j-1] = ID[str[j]];

      }

      for(i = 1 ;i <= n ;i ++)

      {

         scanf("%s" ,str);

         for(j = 2 ;j <= n + 1 ;j ++)

         G_b[ID[str[0]]][ID[str[j]]] = n - j + 2;

      }

      Marr(n);

      for(i = 1 ;i <= n ;i ++)

      Ans[i].a = nameb[i] ,Ans[i].b = nameg[nowb[i]];

      sort(Ans + 1 ,Ans + n + 1 ,camp);

      for(i = 1 ;i <= n ;i ++)

      printf("%c %c\n" ,Ans[i].a ,Ans[i].b);

      if(t) printf("\n");

   }

   return 0;

}

hdu1914 稳定婚姻问题的更多相关文章

  1. HDU1914 稳定婚姻匹配

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

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

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

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

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

  4. BZOJ2140: 稳定婚姻

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

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

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

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

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

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

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

  8. poj 3487 稳定婚姻

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

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

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

随机推荐

  1. 关于 C++ 中的强制转换 - 基础篇

    引言 假设有基类 A,包含了虚函数 func1,以及有派生类 B,继承于类 A,派生类 B 中实现了函数 func1.此时可以用 A 类型的指针指向 B 类型的对象,并用 A 类型的指针调用 B 类型 ...

  2. 关于win10 编辑文件时权限不足问题

    win10默认是不开启administrator账户的,所以一般是自己创建一个账户,但是此账户,可能会有些文件或文件夹,访问不了,编辑不了,这时候,只需要右键->属性->安全->编辑 ...

  3. 为什么是InfluxDB | 写在《InfluxDB原理和实战》出版之际

    1年前写的一篇旧文,文中的分析,以及探讨的问题和观点,至今仍有意义. 从2016年起,笔者在腾讯公司负责QQ后台的海量服务分布式组件的架构设计和研发工作,例如微服务开发框架SPP.名字路由CMLB.名 ...

  4. java实现回溯算法

    最近有在leetcode上面做算法题,已经遇到了两道回溯算法的题目,感觉一点思路都没有,现决定将java如何实现回溯算法做一次总结. 什么叫做回溯算法 (摘抄于百度百科) 回溯算法实际上一个类似枚举的 ...

  5. Mybatis最权威的知识点

    1.什么是Mybatis? (1)Mybatis是一个半ORM(对象关系映射)框架,它内部封装了JDBC,开发时只需要关注SQL语句本身,不需要花费精力去处理加载驱动.创建连接.创建statement ...

  6. polay计数原理

    公式: Burnside引理: 1/|G|*(C(π1)+C(π2)+C(π3)+.....+C(πn)): C(π):指不同置换下的等价类数.例如π=(123)(3)(45)(6)(7),X={1, ...

  7. 谈谈对IOC及DI的理解与思考

    一.前言 在实际的开发过程中,我们经常会遇到这样的情况,在进行调试分析问题的时候,经常需要记录日志信息,这时可以采用输出到控制台. 因此,我们通常会定义一个日志类,来实现输出日志. 定义一个生成验证的 ...

  8. Android 学习之活动的生命周期

    •返回栈 Android 中的活动是可以叠层的: 我们每启动一个新的活动,就会覆盖在原活动之上: 然后点击 Back 键会销毁最上面的活动,下面一个活动就会重新显示出来: 其实 Android 是使用 ...

  9. vue封装公用弹出框方法,实现点击出现操作弹出框

    vue封装公用弹出框方法,实现点击出现操作弹出框 如上图所示,这次要实现一个点击出现操作弹框的效果:并将这个功能封装成一个函数,便于在项目的多个地方使用. 具体思路是: 封装一个组件,组件保护一个插槽 ...

  10. oo第四单元暨课程总结

    第四单元架构设计总结 第一次作业 单独写了MyUmlClass.MyUmlInterface.MyUmlOperation三个类对应UML中相应元素,在UML图中这几个元素包含一些下级元素,如Clas ...