HDU 1522 Marriage is Stable 【稳定婚姻匹配】(模板题)

<题目链接>

题目大意:

给你N个男生和N个女生,并且给出所有男生和女生对其它所有异性的喜欢程度,喜欢程度越高的两个异性越容易配对,现在求出它们之间的稳定匹配。

解题分析:

稳定婚姻问题的模板题,需要用到Gale_Shapley算法,GS算法讲解  >>>

这个算法还是很直观的。

 1 #include <iostream>
 2 #include <cstring>
 3 #include <stack>
 4 #include <string>
 5 #include <map>
 6 #include <algorithm>
 7 using namespace std;
 8
 9 #define N 505
10 #define clr(a,b) memset(a,b,sizeof(a))
11 #define rep(i,s,t) for(int i=s;i<=t;i++)
12
13 int n,getmp_boy[N][N],getmp_girl[N][N],boy[N],girl[N],rnk[N];
14 map<string,int>mp_boy,mp_girl;
15 string s,name_boy[N],name_girl[N];
16
17 void Gale_Shapley(){
18     clr(boy,0);clr(girl,0);
19     rep(i,1,n) rnk[i]=1;
20     while(true){
21         bool flag=false;
22         rep(i,1,n){
23             if(!boy[i]){
24                 int x=getmp_boy[i][rnk[i]++];   //x为当前男生所最求的他没有尝试最求过的最喜欢的女生
25                 if(!girl[x]){    //如果这个女生没有和男生配对
26                     boy[i]=x;    //那么这对男女进行配对
27                     girl[x]=i;
28                 }else if(getmp_girl[x][i] > getmp_girl[x][girl[x]]){    //如果当前女生已经配对,那么就判断她对这两个男生的喜欢程度
29                     boy[girl[x]]=0;     //将原来的男生抛弃
30                     girl[x]=i;      //将这两个男女进行配对
31                     boy[i]=x;
32                 }
33                 flag=true;
34             }
35         }
36         if(!flag)break;    //如果所有男生都已配对,则直接退出
37     }
38     rep(i,1,n) cout<<name_boy[i]<<" "<<name_girl[boy[i]]<<endl;
39 }
40
41 int main(){
42     ios_base::sync_with_stdio(false);
43     cin.tie(0);cout.tie(0);
44     while(cin>>n){
45         mp_boy.clear();mp_girl.clear();
46         int pos=1,tmp;
47         rep(i,1,n){
48             cin>>s;name_boy[i]=s;
49             mp_boy[s]=i;
50             rep(j,1,n){
51                 cin>>s;tmp=mp_girl[s];
52                 if(!tmp){        //对于之前没有出现过个的女生姓名,重新分配序号
53                     tmp=pos++;
54                     mp_girl[s]=tmp;
55                     name_girl[tmp]=s;
56                 }
57                 getmp_boy[i][j]=tmp;    //记录第i个男生第j个喜欢的女生是tmp
58             }
59         }
60         rep(i,1,n){
61             cin>>s;int x=mp_girl[s];
62             rep(j,1,n){
63                 cin>>s;int y=mp_boy[s];
64                 getmp_girl[x][y]=n-j;   //记录第i个女生喜欢男生y的程度是n-j
65              }
66         }
67         Gale_Shapley();
68     }
69 }

2019-01-17

原文地址:https://www.cnblogs.com/00isok/p/10280175.html

时间: 2024-10-12 00:28:35

HDU 1522 Marriage is Stable 【稳定婚姻匹配】(模板题)的相关文章

hdu 2255 二分图带权匹配 模板题

模板+注解在 http://blog.csdn.net/u011026968/article/details/38276945 hdu 2255 代码: //KM×î´ó×îСƥÅä #include <cstdio> #include <cstring> #include <algorithm> #include <iostream> using namespace std; #define INF 0x0fffffff const int MAXN

简单的稳定婚姻匹配

一.相关的定义 1.有一个男士集合和一个女士集合.每个男士都有一个优先级列表,把女士按潜在结婚对象进行优先级排序. 同样的,女士也有一个对潜在结婚对象的优先级列表. 婚姻匹配: 一个婚姻匹配M是一个包含n个(m,w)对的集合,每一对的成员都按照一对一的模式从两个不相交的n元素集合Y和X中选出.也就是说,Y中的每个男士m都只和X中的一位女士w配对,反正亦然.相当于一个二分图中,边来连接可能结婚的对象,两边的顶点代表X和Y,婚姻匹配也是图中的一个完美匹配. 婚姻的稳定:如果在匹配M中,,男士m和女士

HDU1914 稳定婚姻匹配

The Stable Marriage Problem Time Limit: 5000/1000 MS (Java/Others)    Memory Limit: 65535/32768 K (Java/Others)Total Submission(s): 758    Accepted Submission(s): 389 Problem Description The stable marriage problem consists of matching members of two

(算法)稳定婚姻匹配

题目: 婚介所登记了N位男孩和N位女孩,每个男孩都对N个女孩的喜欢程度做了排序,每个女孩都对N个男孩的喜欢程度做了排序,你作为月老,能否给出稳定的牵手方案? 稳定的定义:如果男孩i和女孩a牵手,但男孩i对女孩b更喜欢,而女孩b的男朋友j拼不过男孩i,则没有力量阻碍男孩i和女孩b的私奔,这即是不稳定的. 思路: 1962 年,美国数学家 David Gale 和 Lloyd Shapley 发明了一种寻找稳定婚姻的策略.不管男女各有多少人,不管他们各自的偏好如何,应用这种策略后总能得到一个稳定的婚

稳定婚姻匹配问题

一.问题 有N男N女,每个人都按照他对异性的喜欢程度排名.现在需要写出一个算法安排这N个男的.N个女的结婚,要求两个人的婚姻应该是稳定的. 何为稳定? 有两对夫妻M1 F2,M2 F1.M1心目中更喜欢F1,但是他和F2结婚了,M2心目中更喜欢F2,但是命运却让他和F1结婚了,显然这样的婚姻是不稳定的, 随时都可能发生M1和F1私奔或者M2和F2私奔的情况.所以在做出匹配选择的时候(也就是结婚的时候),我们需要做出稳定的选择,以防这种情况的发生. 二.算法步骤描述: 第一轮,每个男人都选择自己名

UOJ#80 二分图最大权匹配 [模板题]

从前一个和谐的班级,有 nlnl 个是男生,有 nrnr 个是女生.编号分别为 1,…,nl1,…,nl 和 1,…,nr1,…,nr. 有若干个这样的条件:第 vv 个男生和第 uu 个女生愿意结为配偶,且结为配偶后幸福程度为 ww. 请问这个班级里幸福程度之和最大是多少? 输入格式 第一行三个正整数,nl,nr,mnl,nr,m. 接下来 mm 行,每行三个整数 v,u,wv,u,w 表示第 vv 个男生和第 uu 个女生愿意结为配偶,且幸福程度为 ww.保证 1≤v≤nl1≤v≤nl,1≤

HDU - 1010 Tempter of the Bone 深搜模板题(DPS)解题报告

Tempter of the Bone Time Limit: 2000/1000 MS (Java/Others)    Memory Limit: 65536/32768 K (Java/Others) Total Submission(s): 88587    Accepted Submission(s): 24116 Problem Description The doggie found a bone in an ancient maze, which fascinated him a

hdu 1213 求连通分量(并查集模板题)

求连通分量 Sample Input2 //T5 3 //n m1 2// u v2 34 5 5 12 5 Sample Output24 1 # include <iostream> 2 # include <cstdio> 3 # include <cstring> 4 # include <algorithm> 5 # include <cmath> 6 # include <queue> 7 # define LL long

hdu 3065 病毒侵袭持续中 AC自动机模板题 ,,一A。

病毒侵袭持续中 Time Limit: 2000/1000 MS (Java/Others)    Memory Limit: 32768/32768 K (Java/Others) Total Submission(s): 7685    Accepted Submission(s): 2687 Problem Description 小t非常感谢大家帮忙解决了他的上一个问题.然而病毒侵袭持续中.在小t的不懈努力下,他发现了网路中的"万恶之源".这是一个庞大的病毒网站,他有着好多好多