1 问题描述

何为稳定婚姻问题?

有一个男士的集合Y = {m1,m2,m3…,mn}和一个女士的计划X = {n1,n2,n3,…,nn}。每一个男士有一个排序的列表,把女士按照潜在的优先级进行排序。同样,每一个女士也有一个男士的优先级列表。现在,把男士和女士进行配对,要求尽可能的符合优先级的要求。使得最终的配对结果,男士对女士都可接受,不会出现拒绝的情况,即每对男士和女士都是稳定的。

2 解决方案

上述对于稳定婚姻问题的解释有点牵强,具体可以看一下下面截图:

下面代码所使用的男士和女士集合数据是上图的实例,即男士3人,女士3人。

package com.liuzhen.practice;

import java.util.Scanner;

public class Main {

    public void getResult(int[][] boys, int[][] girls) {
int[] result = new int[boys.length];
int[] used = new int[girls.length]; //最终女士配对的男士
for(int i = 0;i < girls.length;i++) {
used[i] = -1;
result[i] = -1;
}
int count = 0; //统计已完成配对个数
while(count < boys.length) {
for(int i = 0;i < boys.length;i++) {
if(result[i] != -1) //当男士i已完成配对时,进行下一个男士配对
continue;
for(int j = 0;j < boys[0].length;j++) {
if(used[boys[i][j]] == -1) {
used[boys[i][j]] = i; //女士boys[i][j]与男士i配对
result[i] = boys[i][j]; //男士i和女士boys[i][j]配对
break; //男士i完成配对,退出循环
} else {
int temp = 0, temp1 = 0;
for(;temp < girls[0].length;temp++) { //求出男士i在女士boys[i][j]心中的优先级
if(girls[boys[i][j]][temp] == i)
break;
}
for(;temp1 < girls[0].length;temp1++) { //求出当前女士已配对男士在其心中的优先级
if(girls[boys[i][j]][temp1] == used[boys[i][j]])
break;
}
if(temp < temp1) { //当男士i比目前已与女士配对的男士优先级要高时
result[used[boys[i][j]]] = -1; //已配对男士被踢
used[boys[i][j]] = i; //当前女士的配偶换成男士i
result[i] = boys[i][j];
break; //男士i完成配对,退出循环
}
}
}
}
count = 0;
for(int i = 0;i < used.length;i++) {
if(used[i] != -1)
count++;
}
}
//打印出结果
for(int i = 0;i < result.length;i++)
System.out.println("男士"+i+"和女士"+result[i]+"配对");
return;
} public static void main(String[] args) {
Main test = new Main();
Scanner in = new Scanner(System.in);
int n = in.nextInt();
int[][] boys = new int[n][n]; //男士的心中对象优先级
int[][] girls = new int[n][n]; //女士的心中对象优先级
for(int i = 0;i < n;i++) {
int one = in.nextInt(); //优先级为1
int two = in.nextInt(); //优先级为2
int three = in.nextInt(); //优先级为3
boys[i][0] = one;
boys[i][1] = two;
boys[i][2] = three;
}
for(int i = 0;i < n;i++) {
int one = in.nextInt(); //优先级为1
int two = in.nextInt(); //优先级为2
int three = in.nextInt(); //优先级为3
girls[i][0] = one;
girls[i][1] = two;
girls[i][2] = three;
}
test.getResult(boys, girls);
}
}

运行结果:

1 0 2
2 0
1 0
2 0
0 1
2 0
男士0和女士0配对
男士1和女士2配对
男士2和女士1配对

Java实现稳定婚姻问题的更多相关文章

  1. 算法笔记_138:稳定婚姻问题(Java)

    目录 1 问题描述 2 解决方案   1 问题描述 何为稳定婚姻问题? 有一个男士的集合Y = {m1,m2,m3...,mn}和一个女士的计划X = {n1,n2,n3,...,nn}.每一个男士有 ...

  2. HDU1522 稳定婚姻匹配 模板

    Marriage is Stable Time Limit: 2000/1000 MS (Java/Others)    Memory Limit: 65536/32768 K (Java/Other ...

  3. 【HDU1914 The Stable Marriage Problem】稳定婚姻问题

    题目链接:http://acm.hdu.edu.cn/showproblem.php?pid=1914 题目大意:问题大概是这样:有一个社团里有n个女生和n个男生,每位女生按照她的偏爱程度将男生排序, ...

  4. UVA 1175 Ladies' Choice 稳定婚姻问题

    题目链接: 题目 Ladies' Choice Time Limit: 6000MS Memory Limit: Unknown 64bit IO Format: %lld & %llu 问题 ...

  5. BZOJ2140: 稳定婚姻

    题解: 题意就是求二分图的必须边. 我们有结论: 在残量网络上跑tarjan,对于一条边(u,v) 如果该边满流||scc[u]==scc[v],那么该边是可行边. 因为如果scc[u]==scc[v ...

  6. 【POJ 3487】 The Stable Marriage Problem (稳定婚姻问题)

    The Stable Marriage Problem   Description The stable marriage problem consists of matching members o ...

  7. 【UVAlive 3989】 Ladies' Choice (稳定婚姻问题)

    Ladies' Choice Teenagers from the local high school have asked you to help them with the organizatio ...

  8. 【稳定婚姻问题】【HDU1435】【Stable Match】

    2015/7/1 19:48 题意:给一个带权二分图  求稳定匹配 稳定的意义是对于某2个匹配,比如,( a ---- 1) ,(b----2) , 如果 (a,2)<(a,1) 且(2,a)& ...

  9. poj 3487 稳定婚姻

    /** 稳定婚姻:男生不停的求婚,女生不停地拒绝 **/ #include <iostream> #include <queue> #include <cstdio> ...

随机推荐

  1. Java调用支付宝支付遇到的坑

    下单成功,回调不成功 原因:支付宝公钥填成商户公钥.这两个公钥是不一样的,但开头和结尾很多字符都一样,如果不用文本比对器比对很难发现!而且支付宝公钥填成商户公钥还能下单成功,只是回调不成功,这让原因更 ...

  2. vue cli脚手架项目利用webpack给生产环境和发布环境配置不同的接口地址或者不同的变量值。

    废话不多说,直接进入正题,此文以配置不同的接口域名地址为例子 项目根目录下有一个config文件夹,基础项目的话里面至少包括三个文件, 1.dev.env.js 2.index.js 3.prod.e ...

  3. java ->Servlet接口

    JavaWeb核心之Servlet Servlet简介 什么是Servlet(控制器的作用) Servlet 运行在服务端的Java小程序,是sun公司提供一套规范(接口),用来处理客户端请求.响应给 ...

  4. Python基础语法day_03——列表

    day_03 列表是什么 在Python中,用[]来表示列表,并用逗号来分隔其中的元素.下面是一个简单的列表示例: >>> bicycles = ['treak','cannonda ...

  5. python 定义一个插入数据(可以插入到每个表中)通用的方法

    前提置要:想要写一个方法,这个方法是插入数据到数据表的方法,只需要提供表名称,字段名称,还有插入的值,只要调用这个方法就可以自动帮助你插入数据 以下是不断实践优化出来 原本的插入数据库中的代码应该是这 ...

  6. Android 开发技术周报 Issue#280

    新闻 6分钟完整视频提前看光谷歌新机Pixel 4a 统一推送官方解读:消灭Android毒瘤.待机续航猛增43% Google Play细化搜索结果:可按评分.编辑推荐.最新上线过滤 教程 了解一下 ...

  7. 我参与 Seata 开源项目的一些感悟

    丁老师在他的知识星球邀请我回答以下一个问题: 我觉得这个问题非常有意思,姑且把它贴到公众号这里,与大家分享一下我对这个问题的一些感悟. 感谢丁老师的邀请问答: 在这里我就简单说下,我这段时间参与 Se ...

  8. docker容器与系统时间同步最佳方法

    前言:在Docker容器创建好之后,可能会发现容器时间跟宿主机时间不一致,此时需要同步它们的时间,让容器时间跟宿主机时间保持一致. 一.分析时间不一致的原因 宿主机采用了CST时区,CST应该是指(C ...

  9. IOS真机测试(已拥有个人开发者证书)

    创建真机调试证书并进行真机测试 步骤1 在启动台中点击其他,找到钥匙串访问. 步骤2 在打开的界面中点击右边的系统根证书,然后点击左上角的钥匙串访问,然后是证书助理,最后点击从证书颁发机构申请证书. ...

  10. python中的基础坑

    v = [lambda :x for x in range(10)] print(v) #[lambda :x,lambda :x....]10个匿名函数 print(v[0]) #lambda :x ...