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 different sets according to the member’s preferences for the other set’s members. The input for our problem consists of:

a set M of n males;
a set F of n females;

for each male and female we have a list of all the members of the opposite gender in order of preference (from the most preferable to the least).
A marriage is a one-to-one mapping between males and females. A marriage is called stable, if there is no pair (m, f) such that f ∈ F prefers m ∈ M to her current partner and m prefers f over his current partner. The stable marriage A is called male-optimal if there is no other stable marriage B, where any male matches a female he prefers more than the one assigned in A.

Given preferable lists of males and females, you must find the male-optimal stable marriage.

Input

The first line gives you the number of tests. The first line of each test case contains integer n (0 < n < 27). Next line describes n male and n female names. Male name is a lowercase letter, female name is an upper-case letter. Then go n lines, that describe preferable lists for males. Next n lines describe preferable lists for females.

Output

For each test case find and print the pairs of the stable marriage, which is male-optimal. The pairs in each test case must be printed in lexicographical order of their male names as shown in sample output. Output an empty line between test cases.

Sample Input

2

3

a b c A B C

a:BAC

b:BAC

c:ACB

A:acb

B:bac

C:cab

3

a b c A B C

a:ABC

b:ABC

c:BCA

A:bac

B:acb

C:abc

Sample Output

a A
b B
c C

a B
b A
c C

Source

Southeastern Europe 2007

题意:裸婚姻匹配,注意男士排序时的序号一定不要弄混了。

代码:

#include<iostream>
#include<cstdio>
#include<cstring>
#include<map>
#include<queue>
#include<algorithm>
using namespace std;
const int maxn=30;
int pref[maxn][maxn],ord[maxn][maxn],fum[maxn],fuw[maxn],nex[maxn];
int t,n;
char ch[30],s[35],x;
int nu[30];
map<char,int>vm,vw;
map<int,char>um,uw;
bool cmp(int x,int y)
{
    return ch[x]<ch[y];
}
queue<int>q;
void engage(int m,int w)
{
    int pm=fum[w];
    if(pm){
        fuw[pm]=0;
        q.push(pm);
    }
    fuw[m]=w;
    fum[w]=m;
}
int main()
{
    scanf("%d",&t);
    while(t--){
        memset(pref,0,sizeof(pref));
        vm.clear();vw.clear();um.clear();uw.clear();
        scanf("%d",&n);
        for(int i=1;i<=n;i++){
            cin>>ch[i];
            nu[i]=i;
        }
        sort(nu+1,nu+1+n,cmp);
        for(int i=1;i<=n;i++){
            int tmp=nu[i];
            vm[ch[tmp]]=tmp;
            um[tmp]=ch[tmp];
            fuw[tmp]=0;
            nex[tmp]=1;
            q.push(tmp);
        }
        for(int i=1;i<=n;i++){
            cin>>x;
            vw[x]=i;
            uw[i]=x;
            fum[i]=0;
        }
        for(int i=1;i<=n;i++){
            scanf("%s",s);
            int tmp=vm[s[0]];
            for(int j=2;j<n+2;j++){
                pref[tmp][j-1]=vw[s[j]];
            }
        }
        for(int i=1;i<=n;i++){
            scanf("%s",s);
            int tmp=vw[s[0]];
            for(int j=2;j<n+2;j++){
                ord[tmp][vm[s[j]]]=j-1;
            }
        }
        while(!q.empty()){
            int m=q.front();
            q.pop();
            int w=pref[m][nex[m]++];
            if(w==0) continue;
            if(!fum[w])
                engage(m,w);
            else if(ord[w][m]<ord[w][fum[w]])
                engage(m,w);
            else q.push(m);
        }
        while(!q.empty()) q.pop();
        for(int i=1;i<=n;i++){
            int tmp=nu[i];
            printf("%c %c\n",um[tmp],uw[fuw[tmp]]);
        }
        if(t!=0) printf("\n");
    }
    return 0;
}
时间: 2024-10-31 03:52:19

HDU1914 稳定婚姻匹配的相关文章

简单的稳定婚姻匹配

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

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

<题目链接> 题目大意: 给你N个男生和N个女生,并且给出所有男生和女生对其它所有异性的喜欢程度,喜欢程度越高的两个异性越容易配对,现在求出它们之间的稳定匹配. 解题分析: 稳定婚姻问题的模板题,需要用到Gale_Shapley算法,GS算法讲解  >>> 这个算法还是很直观的. 1 #include <iostream> 2 #include <cstring> 3 #include <stack> 4 #include <stri

(算法)稳定婚姻匹配

题目: 婚介所登记了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私奔的情况.所以在做出匹配选择的时候(也就是结婚的时候),我们需要做出稳定的选择,以防这种情况的发生. 二.算法步骤描述: 第一轮,每个男人都选择自己名

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

什么是算法?每当有人问作者这样的问题时,他总会引用这个例子:假如你是一个媒人,有若干个单身男子登门求助,还有同样多的单身女子也前来征婚.如果你已经知道这些女孩儿在每个男孩儿心目中的排名,以及男孩儿们在每个女孩儿心中的排名,你应该怎样为他们牵线配对呢? 最好的配对方案当然是,每个人的另一半正好都是自己的“第一选择”.这虽然很完美,但绝大多数情况下都不可能实现.比方说,男1号最喜欢的是女1号,而女1号的最爱不是男1号,这两个人的最佳选择就不可能被同时满足.如果好几个男孩儿最喜欢的都是同一个女孩儿,这

UVALive 3989Ladies&#39; Choice(稳定婚姻问题)

题目链接 题意:n个男生和女生,先是n行n个数,表示每一个女生对男生的好感值排序,然后是n行n列式每一个男生的好感值排序,输出N行,即每个女生在最好情况下的男生的编号 分析:如果是求女生的最好情况下,就要从女生开始选,这样女生都是从最好的到不好的来选,而男生却相反--只能娶那些自己有可能最没好感的女生,因为男生是被动的,他最喜欢的女生不见的会向他求婚. 刘汝佳书上命名错了,so也跟着把男生当成女生了,懒得改命名了, 1 #include <iostream> 2 #include <cs

BZOJ2140: 稳定婚姻

题解: 题意就是求二分图的必须边. 我们有结论: 在残量网络上跑tarjan,对于一条边(u,v) 如果该边满流||scc[u]==scc[v],那么该边是可行边. 因为如果scc[u]==scc[v],那么说明v到u有通路,我们把v-u的路以及u-v这条边全部反色,也就是匹配->非匹配,非匹配->匹配.同样还是最大匹配.这说明该边是可行的. 如果该边满流&&scc[u]!=scc[v],那么该边是必须边. 因为如果去掉这条边,最大匹配会减少1(想想看),所以该边必须出现在最大

UVA 1175 - Ladies&#39; Choice(稳定婚姻问题)

UVA 1175 - Ladies' Choice 题目链接 题意:给定n个男人,n个女人,每个人心中对异性都有一个排序,从左往右是最喜欢到最不喜欢,然后现在要求一个稳定匹配,使得n对男女中,不存在男人对其他女人好感度大于配偶且女人对其他男人好感度大于配偶 思路:稳定婚姻问题,算法过程如下: 男人不断求婚,从最喜欢到最不喜欢,女人每次在求婚人中,选择一个最喜欢的配对,然后抛弃现在的配对,这个过程可以用一个队列存放求婚男人,这样直到队列为空,也就匹配完毕了 代码: #include <cstdio

UOJ.41.[清华集训2014]矩阵变换(稳定婚姻)

题目链接 稳定婚姻问题:有n个男生n个女生,每个男/女生对每个女/男生有一个不同的喜爱程度.给每个人选择配偶. 若不存在 x,y未匹配,且x喜欢y胜过喜欢x当前的配偶,y喜欢x也胜过y当前的配偶 的完备匹配,则称这是一个稳定匹配. 稳定匹配一定存在,且存在一个\(O(n^2)\)的算法: 任选一个未匹配的男生x,按x的喜爱程度从大到小枚举每个女生,若当前女生没有配偶或喜欢x胜过喜欢当前配偶,则与x匹配.直到所有男生都匹配. 这一题我们用行表示男生,n个数表示女生.喜爱程度为:行更喜欢靠前的数,数