结婚匹配问题

问题大概是这样:有一个社团里有n个女生和n个男生,每位女生依照她的偏爱程度将男生排序,同一时候每位男生也依照自己的偏爱程度将女生排序。然后将这n个女生和n个男生配成完备婚姻。

假设存在两位女生A和B,两位男生a和b,使得A和a结婚。B和b结婚,可是A更偏爱b而不是a,b更偏爱A而不是B。则这个婚姻就是不稳定的。A和b可能背着别人相伴而走。由于他俩都觉得,与当前配偶比起来他们更偏爱各自的新伴侣。

假设完备婚姻不是不稳定的。则称其是稳定的。通过证明,能够得到每个n女n男的社团,都存在稳定婚姻的结论。可是这样的情况仅仅在异性的社团中存在。

也就是说在同性的社团里面。稳定婚姻的存在性将不再被保证。

Gale-Shapley 算法

while  存在男人m是自由的且还没对每一个女人都求过婚

选择这个男人m

令w是m的优先表中还没求过婚的最高排名的女人

if  w是自由的

(m。w)变成约会状态

else  w当前与m1约会

if  w更偏爱m1而不爱m

m保持自由

else    w更偏爱m而不爱m1

(m。w)变成约会状态

m1变成自由

endif

endif

endwhile

以下是关于 稳定婚姻问题 的题目:

1. ZJU
1576 Marriage is Stable

AC代码例如以下:

#include<iostream>
#include<cstring>
#include<string>
#include<map>
using namespace std;

int nb, ng, n;
map<string, int> boy;
map<string, int> girl;
string boymk[510], girlmk[510];

int a[510][510], rank[510][510], pose[510];
int vm1[505], vm2[505], input[510];

int find_boy(string s){
    if (boy.count(s) == 0){
        boymk[nb] = s;
        boy[s] = nb;
        nb++;
    }
    return boy[s];
}

int find_girl(string s){
    if (girl.count(s) == 0){
        girlmk[ng] = s;
        girl[s] = ng;
        ng++;
    }
    return girl[s];
}

int main(){
    int i, j, v1, v2, u, v;
    string s;
    while (cin >> n){
        nb = ng = 0;
        boy.clear();  girl.clear();
        for (i = 0; i < n; i++){
            cin >> s;
            v1 = find_boy(s);
            input[i] = v1;
            for (j = 0; j < n; j++){
                    cin >> s;
                    v2 = find_girl(s);
                    a[v1][j] = v2;
            }
        }
        for (i = 0; i < n; i++){
            cin >> s;
            v1 = find_girl(s);
            for (j = 0; j < n; j++){
                    cin >> s;
                    v2 = find_boy(s);
                    rank[v1][v2]=j;
            }
        }
        memset(pose, 0, sizeof(pose));
        memset(vm1, -1, sizeof(vm1));
        memset(vm2, -1, sizeof(vm2));
        while(1){
            for (i = 0; i < n; i++) if (vm1[i] == -1) break;
            if (i == n) break;
            u = i;
            v = a[u][pose[u]++];
            if (vm2[v] == -1){
                    vm2[v] = u;
                    vm1[u] = v;
            }
            else if (rank[v][vm2[v]] > rank[v][u]){
                    vm1[vm2[v]] = -1;
                    vm2[v] = u;
                    vm1[u] = v;
            }
        }
        for (i = 0; i < n; i++)
                cout << boymk[input[i]] << ‘ ‘ << girlmk[vm1[input[i]]] << endl;
        cout << endl;
    }
    return 0;
}
时间: 2024-08-25 19:14:34

结婚匹配问题的相关文章

简单的稳定婚姻匹配

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

HDU4685 Prince and Princess 完美匹配+强连通

题意:现在有n个王子,m个公主.现在要给他们配对,王子会和他喜欢的一个人结婚,而公主不能做选择. 这题啃得好费劲,有个类似的题目poj1904,那个题目也是给王子与公主配对,但那个是王子公主各n个,且给定了一个完美匹配,然后求每个王子可以做出的选择且不影响最大匹配数目.那题是先建各条喜欢关系的边,然后在由被选择的公主连一条边到与之配对的王子,强连通之后如果一个王子和一个公主在一个强连通分量中,那么他们结合的话,他们的另一半也各自能在强连通中找到另外的匹配,就是符合题意的结果了. 这个题目算是升级

和高中同学结婚的好处

有些同学高中时期就开始恋爱,然后一起上大学,一起回到家乡找工作,就结婚了.这种从一而终的爱情长跑让人唏嘘感慨:也有些同学高中并没有谈恋爱,自己也经历过几段感情,后来回家参加同学聚会时,对高中同学心生好感,然后就迅速的在一起谈婚论嫁了.下面小编带大家看看和高中同学结婚的好处. 1.初恋的感情是最深的.很多夫妻都有一个隐形的情敌,那就是对方的初恋.初恋是在最美好的年纪发生的美好的事,所以总是让人念念不忘.如果你高中就开始恋爱,最终修成正果,那么那些隐形情敌之类的担忧就可以不用考虑了,你们互相就是对方

二分图最佳匹配,求最大权匹配或最小权匹配

Beloved Sons http://acm.zju.edu.cn/onlinejudge/showProblem.do?problemId=1338 题意:国王有N个儿子,现在每个儿子结婚都能够获得一定的喜悦值,王子编号为1-N,有N个女孩的编号同样为1-N,每个王子心中都有心仪的女孩,现在问如果安排,能够使得题中给定的式子和最大. 分析:其实题目中那个开根号是个烟雾弹,只要关心喜悦值的平方即可.那么对王子和女孩之间构边,边权为喜悦值的平方,对于每一个王子虚拟出一个女孩边权为0,这样是为了所

如果把准备结婚作为一个项目,应该怎样开展需求分析

2000人软件需求设计讨论QQ群120670217 如果把准备结婚作为一个项目,应该怎样开展需求分析       AppleTree(271***62) 10:55:12 潘老师 AppleTree(271***62) 10:55:40 野人(83***932) 12:48:03 FOREVER(16***468) 15:17:05 呵呵 潘加宇(3504847) 7:19:57 一样.结婚就是引进一个新的人肉系统. 老大.以前是父母,结婚的人只是家族的棋子,现在应该是自己. 愿景:希望通过引进

稳定婚姻匹配问题

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

UVALive-2966 King&#39;s Quest(强连通+二分图匹配)

题目大意:有n个男孩和和n个女孩,已只每个男孩喜欢的女孩.一个男孩只能娶一个女孩.一个女孩只能嫁一个男孩并且男孩只娶自己喜欢的女孩,现在已知一种他们的结婚方案,现在要求找出每个男孩可以娶的女孩(娶完之后不能影响其他男孩结婚). 题目分析:已知的结婚方案是一个完全匹配.从每个男孩出发向他喜欢的女孩连一条有向边,得到一张完全二分图,实际上这道题是让判断去掉哪一些边使图仍然完全匹配.设男生x1和女生y1是已知方案中要结婚的两个人,假如x1抛弃y1,选择了他也喜欢的y2结婚(也就是去掉边x1->y2),

H - Prince and Princess - HDU 4685(二分匹配+强连通分量)

题意:有N个王子M个公主,王子喜欢一些公主,而且只能是王子喜欢的人,他们才可以结婚,现在让他们尽可能多的结婚的前提下找出来每个王子都可以和谁结婚. 分析:先求出来他们的最大匹配,因为给的数据未必是完备匹配,所以需要添加一些点使他们成为完备匹配才能求出来的环是完整的,比如第二组数据: 1 2   2 1 2 如果不添加虚拟点做成匹配,只会匹配成功一个,这样就找不出来环了,所以需要添加虚拟的王子和公主,虚拟的王子喜欢所有的公主,虚拟的公主被所有的王子喜欢,注意都是王子喜欢公主的,公主没有选择喜欢的权

学2分匹配 (模版)

转自 http://blog.csdn.net/q3498233/article/details/5786225 二分图:二分图是这样一个图,它的顶点可以分类两个集合X和Y,所有的边关联的两个顶点恰好一个属于集合X,另一个属于集合Y. 二分图匹配:给定一个二分图G,在G的一个子图M中,M的边集中的任意两条边都不依附于同一个顶点(即2条匹配的边是没有公共顶点),则称M是一个匹配.最大匹配:图中包含边数最多的匹配称为图的最大匹配.完美匹配:如果所有点都在匹配边上,则称这个最大匹配是完美匹配. 二分图