LA3987 Ladies’ Choice 婚姻稳定算法

Problem I – Ladies’ Choice

Background

Teenagers from the local high school have asked you to help them with the organization of next year’s Prom. The idea is to find a suitable date for everyone in the class in a fair and civilized way. So, they have organized a web site where all students,
boys and girls, state their preferences among the class members, by ordering all the possible candidates. Your mission is to keep everyone as happy as possible. Assume that there are equal numbers of boys and girls.

Problem

Given a set of preferences, set up the blind dates such that there are no other two people of opposite sex who would both rather have each other than their current partners. Since it was decided that the Prom was Ladies‘ Choice, we want to produce the best
possible choice for the girls.

Input

Input consists of multiple test cases the first line of the input contains the number of test cases. There is a blank line before each dataset. The input for each dataset consists of a positive integer N, not greater than 1,000, indicating
the number of couples in the class. Next, there are N lines, each one containing the all the integers from 1 to N, ordered according to the girl’s preferences. Next, there are N lines, each one containing
all the integers from 1 to N, ordered according to the boy’s preferences.

Output

The output for each dataset consists of a sequence of N lines, where the i-th line contains the number of the boy assigned to the i-th girl (from 1 to N). Print a blank line between datasets.

Sample Input

1

5

1 2 3 5 4

5 2 4 3 1

3 5 1 2 4

3 4 2 1 5

4 5 1 2 3

2 5 4 1 3

3 2 4 1 5

1 2 4 3 5

4 1 2 5 3

5 3 2 4 1

Sample Output

1

2

5

3

4

题意:告诉n个男生和n个女生,让他们一起配对跳舞,他们都愿意和自己更喜欢的人一起跳舞。对于当前配对情况,A 和 C ,B 和 D,如果A喜欢B比喜欢C多,B喜欢A比喜欢D多,那么这两对就会被拆散,因为A和B都更愿意和对方在一起。那么,现在就要求怎样配对,才会是最稳定的。输入前n行为男生对女生的喜欢程度排序,后n行为女生对男生的喜欢程度排序。输出依次和n个男生配对的女生编号。

分析:这个问题涉及到婚姻稳定算法,这个算法也叫求婚-拒绝算法(Propose-and-reject algorithm)。这个算法的详细操作过程大概如下。有n对男女进行配对,对于每一轮操作,男士都去追求自己还没有追求过的最喜欢的女生,而女生可以选择答应或者拒绝,即使女生有了搭档,也是可以抛弃之前的,转而接受现在的。当所有人都配对成功之后,算法就可以结束。那么这个问题会不会出现有人没有搭档呢,答案是不会。如果有女生没有搭档的话,表明还没有人追求过她,然而,一个男生在放弃之前,是一定会先追求一遍所有的女生。因此可以保证每个人都能配对成功。

下面就要说一说这个配对方案的稳定性。对于当前配对情况,A 和 C ,B 和 D,如果A女生喜欢B男生比喜欢C多,同时B喜欢A也比喜欢D多,那么,B在和D在一起之前,一定先追求过A这个女生。然而女生每次在换对象的时候,一定是遇到了更好的。所以不会出现B比C更好的情况,同时,B之前已经被A拒绝了,那么D就是他现在觉得最好的。

虽然整个过程,都是女生选择男生,不断有男生被拒绝。然而这个游戏对男生确实最有利的。因为每个男生都有最大的可能和自己最喜欢的人在一起,除非对方拒绝了自己。然而女生却出于一种很被动的状态,因为自己最喜欢的人,可能从来没有追求过自己。所以,或许反过来,让所有的女生去追求选择男生,那么对于女生来讲也会更有利,她们有更多的机会和自己最喜欢的人一起。同样也不会影响算法的稳定性。

#include <iostream>
#include <stdio.h>
#include <string>
#include <cstring>
#include <cmath>
#include <queue>

using namespace std;

queue<int>q;//单身男士队列
int manlike[1009][1009];
int womanlike[1009][1009];
int nt[1009];//男士下一个要选第几喜欢的人
int fwife[1009];
int fhusbond[1009];

int n;
int main()
{
    int T;
    scanf("%d",&T);
    while(T--)
    {
        scanf("%d",&n);

        while(!q.empty()) q.pop();

        for(int i=1;i<=n;i++)
        {
            for(int j=1;j<=n;j++)
                scanf("%d",&manlike[i][j]);

            q.push(i);
            nt[i]=1;
            fwife[i]=0;
        }

        for(int i=1;i<=n;i++)
            for(int j=1;j<=n;j++)
            {
                int k;
                scanf("%d",&k);
                womanlike[i][k]=j;//女士对于编号为k的男士喜欢程度的排名
                fhusbond[i]=0;
            }

        while(!q.empty())
        {
            int man=q.front();
            q.pop();

            int woman=manlike[man][nt[man]];
            nt[man]++;

            if(fhusbond[woman]==0)
            {
                fhusbond[woman]=man;
                fwife[man]=woman;
            }
            else if(womanlike[woman][man] < womanlike[woman][fhusbond[woman]])
            {
                fwife[fhusbond[woman]]=0;
                q.push(fhusbond[woman]);
                fhusbond[woman]=man;
                fwife[man]=woman;
            }
            else q.push(man);
        }
        //cout<<"*******"<<endl;

        for(int i=1;i<=n;i++)
          printf("%d\n",fwife[i]);

          if(T>0) puts("");

    }

    return 0;
}

版权声明:本文为博主原创文章,未经博主允许不得转载。

时间: 2024-11-08 00:01:05

LA3987 Ladies’ Choice 婚姻稳定算法的相关文章

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

uva 1175 Ladies' Choice Background Teenagers from the local high school have asked you to help them with the organization of next year?s Prom. The idea is to find a suitable date for everyone in the class in a fair and civilized way. So, they have or

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

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

UVA 1175 Ladies&#39; Choice 女士的选择(稳定婚姻问题,GS算法)

题意: 给出每个男的心目中的女神排序,给出每个女的心目中的男神排序,即两个n*n的矩阵,一旦任意两个非舞伴的男女同学觉得对方都比现任舞伴要好,他们就会抛弃舞伴而在一起.为了杜绝这种现象,求每个男的最后所搭配的女伴是谁. 思路: 怎么感觉题意有点问题,输出的是第i行的男人所搭配的女人,即输出的是女人! 每个男人依次选择最喜欢的女人求婚,若同一个女的没人抢,则临时抢亲成功,若需要抢,明显女的都是喜欢挑长腿oba啦,矮冬瓜自动加入单身狗队列继续求婚!当单身狗所求的女神已订婚,只要女神更爱单身狗,没有什

浅谈稳定完备婚姻的算法

首先说明:本文不是讨论婚姻问题的,而是一篇以日常生活的婚姻问题为例子说明一个有趣的算法:Gale-Shapley算法(延迟认可算法),如果你为此感到失望的话,我将表示我的歉意,但是你如果有兴趣的话,还是建议你看一下,尤其是对于目前还没有个GF或BF的朋友以及就要结婚的朋友,在讲解算法的实现过程中,你会感到大有裨益. 话说在1962年,两个数学家David Gale 和Lloyd Shapely提出了下面的问题:给定若干个男生和同样多的女生,他们每个人都对所有的异性有一个心理的偏好次序.是否存在一

UVALive 3989 Ladies&#39; Choice

经典的稳定婚姻匹配问题 UVALive - 3989 Ladies' Choice Time Limit: 6000MS Memory Limit: Unknown 64bit IO Format: %lld & %llu [Submit]   [Go Back]   [Status] Description Problem I – Ladies? Choice Background Teenagers from the local high school have asked you to h

uoj 41 【清华集训2014】矩阵变换 婚姻稳定问题

[清华集训2014]矩阵变换 Time Limit: 20 Sec  Memory Limit: 256 MB 题目连接 http://uoj.ac/problem/41 Description 给出一个 N 行 M 列的矩阵A, 保证满足以下性质: M>N.    矩阵中每个数都是 [0,N] 中的自然数.    每行中, [1,N] 中每个自然数都恰好出现一次.这意味着每行中 0 恰好出现 M−N 次.    每列中,[1,N] 中每个自然数至多出现一次. 现在我们要在每行中选取一个非零数,

简单的稳定婚姻匹配

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

UVALive 3989 Ladies&amp;#39; Choice

经典的稳定婚姻匹配问题 UVALive - 3989 Ladies' Choice Time Limit: 6000MS Memory Limit: Unknown 64bit IO Format: %lld & %llu [Submit]   [Go Back]   [Status] Description Problem I – Ladies? Choice Background Teenagers from the local high school have asked you to h

婚姻算法笔记

婚姻算法 曾经有想过类似的问题,婚姻算法中是关于情侣,我想的也是关于情侣方面.当时的想法是:如果每个人都将自己喜欢的人排出个名次列出,供别人参考,不就少了很多失败的表白和示爱吗.男生可以看在女生的排名中的名次来决定追不追.但只想到这里就结束了,没有想过当工作集从单链变成环时应该如何让每个人幸福. 婚姻算法是由Gale和Shapley提出,不考虑版本是雇主和员工还是男女情侣,现在我们只讨论男女情侣,讨论另外一种也可以,其中包含的条件都是相似的.要在已知每个人喜好排名的情况下,安排出匹配.使得婚姻稳