uva 1175 Ladies' 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 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位女生,每人都对每个异性有一个排序,代表对他们的喜欢程度。你的任务是将男生和女生一一配对,使得男生u和女生v不存在以下情况:1)男生u和女生v不是舞伴。2)他们喜欢对方的程度都大于喜欢自己舞伴的程度,如果出现了2)中的情况,他们可能会抛下自己的舞伴,另外组成一组。你的任务是对于每个女生,在所有可能和他跳舞的男生中,找出他最喜欢的那个。

解题思路:经典的稳定婚姻问题。用求婚拒绝算法(Propose-and-reject algorithm)。

#include <cstdio>
#include <cstring>
#include <algorithm>
#include <cmath>
#include <cstdlib>
#include <queue>
using namespace std;

const int N = 1005;
typedef long long ll;
int n;
int men[N][N], getWifi[N], Next[N];
int women[N][N], getHus[N];
queue<int> Q;

void input() {
    scanf("%d", &n);
    for (int i = 1; i <= n; i++) {
        for (int j = 1; j <= n; j++) {
            scanf("%d", &men[i][j]); //编号为i的男生第j喜欢的女生
        }
        Next[i] = 1; //编号为i的男生,下一个要邀请跳舞的对象
        getWifi[i] = 0; //编号为i的男生的舞伴编号
        Q.push(i);
    }
    int x;
    for (int i = 1; i <= n; i++) {
        for (int j = 1; j <= n; j++) {
            scanf("%d", &x);
            women[i][x] = j; //编号为i的女生心目中,编号为x的男生的排名
        }
        getHus[i] = 0; //编号为i的女生的舞伴编号
    }
}

void engage(int man, int woman) {
    if (getHus[woman]) { //如果当前女生已经有了舞伴,那么为了更帅的新舞伴,抛弃他
        getWifi[getHus[woman]] = 0; //被抛弃的男生重新回到单身状态
        Q.push(getHus[woman]);
    }
    getHus[woman] = man; //新的一对
    getWifi[man] = woman;
}

void solve() {
    while (!Q.empty()) {
        int man = Q.front(); Q.pop();
        int woman = men[man][Next[man]++];
        if (!getHus[woman]) { //如果当前女生单身,那直接配对
            engage(man, woman);
        } else if (women[woman][man] < women[woman][getHus[woman]]) {
            //如果当前男生的排名在女生心目中比她舞伴的排名高,抛弃当前舞伴,和新的男生配对
            engage(man, woman);
        } else Q.push(man); //悲剧的男生没人要,回炉重造
    }
    for (int i = 1; i <= n; i++) { //输出
        printf("%d\n", getWifi[i]);
    }
}

int main() {
    int T;
    scanf("%d", &T);
    while (T--) {
        while (!Q.empty()) Q.pop();
        input();
        solve();
        if (T) puts("");
    }
    return 0;
}

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

uva 1175 Ladies' Choice (稳定婚姻问题)

时间: 2024-12-09 22:53:21

uva 1175 Ladies' Choice (稳定婚姻问题)的相关文章

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

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

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

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

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

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

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

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

【bzoj2140】: 稳定婚姻 图论-tarjan

[bzoj2140]: 稳定婚姻 哎..都是模板题.. 一眼看过去 哇 二分图哎 然后发现好像并不能匈牙利算法 自己xjb画两张图,发现二分图左向右连配偶的边,然后右向左连交往过的边 然后如果Bi Gi在同一个强连通分量里面就一定可以在Bi Gi离婚以后再增广一次 最开始用map维护一下名字就好了 1 /* http://www.cnblogs.com/karl07/ */ 2 #include <cstdlib> 3 #include <cstdio> 4 #include &l

(算法)稳定婚姻匹配

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

nyoj 月老的难题 (稳定婚姻问题)

百度了一下稳定婚姻问题.. 还有什么GS算法.. 以为什么高端的东西.. 尼玛结果代码跟上一题一模一样的好吗.. 醉了.. 1 #include<iostream> 2 #include<cstdio> 3 #include<cstdlib> 4 #include<cstring> 5 #include<string> 6 #include<queue> 7 #include<algorithm> 8 #include&l

简单的稳定婚姻匹配

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