目录

1 问题描述

2 解决方案

 


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;    //当前女士的配偶换成男士iresult[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();   //优先级为1int two = in.nextInt();   //优先级为2int three = in.nextInt();  //优先级为3boys[i][0] = one;boys[i][1] = two;boys[i][2] = three;}for(int i = 0;i < n;i++) {int one = in.nextInt();   //优先级为1int two = in.nextInt();   //优先级为2int three = in.nextInt();  //优先级为3girls[i][0] = one;girls[i][1] = two;girls[i][2] = three;}test.getResult(boys, girls);}
}

运行结果:

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

参考资料:

1.《算法设计与分析基础》第3版  Anany Levitin 著   潘彦 译

转载于:https://www.cnblogs.com/liuzhen1995/p/6738234.html

算法笔记_138:稳定婚姻问题(Java)相关推荐

  1. 算法笔记_132:最大流量问题(Java)

    目录 1 问题描述 2 解决方案   1 问题描述 何为最大流量问题? 给定一个有向图,并为每一个顶点设定编号为0~n,现在求取从顶点0(PS:也可以称为源点)到顶点n(PS:也可以称为汇点)后,顶点 ...

  2. 算法笔记_137:二分图的最大匹配(Java)

    目录 1 问题描述 2 解决方案   1 问题描述 何为二分图的最大匹配问题? 引用自百度百科: 首先得说明一下何为匹配: 给定一个二分图G,在G的一个子图M中,M的边集{E}中的任意两条边都不依附于 ...

  3. 金九银十面试即将到来!字节内部数据结构与算法笔记,限时上线,Java程序员们准备好了吗?

    前言 不得不说,现在几乎所有的大厂,比如Google.字节.BAT,面试的时候都喜欢考算法.让人现场写代码,那你有没有真正地想过,为什么这些大公司都喜欢考算法呢? 经常有人说,程序员35岁之后很容易陷 ...

  4. 算法笔记_218:花朵数(Java)

    目录 1 问题描述 2 解决方案   1 问题描述 一个N位的十进制正整数,如果它的每个位上的数字的N次方的和等于这个数本身,则称其为花朵数. 例如: 当N=3时,153就满足条件,因为 1^3 + ...

  5. 排序算法笔记:堆排序 HeapSort in java

    2019独角兽企业重金招聘Python工程师标准>>> /*** 堆排序* 简述:* 首先使用建立最大堆的算法建立好最大堆,然后将堆顶元素(最大值)与最后一个值交换,同时使得堆的长度 ...

  6. java heapsort_排序算法笔记:堆排序 HeapSort in java

    /** * 堆排序 * 简述: * 首先使用建立最大堆的算法建立好最大堆,然后将堆顶元素(最大值)与最后一个值交换,同时使得堆的长度减小1 ,调用保持最大堆性质的算法调整,使得堆顶元素成为最大值,此时 ...

  7. 算法笔记_036:预排序(Java)

    目录 1 问题描述 2 解决方案 2.1 检验数组中元素的唯一性 2.2 模式计算   1 问题描述 在计算机科学中,预排序是一种很古老的思想.实际上,对于排序算法的兴趣很大程度上是因为这样一个事实: ...

  8. 算法笔记_227:填写乘法算式(Java)

    目录 1 问题描述 2 解决方案   1 问题描述 观察下面的算式: * * × * * = * * * 它表示:两个两位数字相乘,结果是3位数.其中的星号(*)代表任意的数字,可以相同,也可以不同, ...

  9. 算法笔记_114:等额本金(Java)

    1 等额本金 标题:等额本金小明从银行贷款3万元.约定分24个月,以等额本金方式还款.这种还款方式就是把贷款额度等分到24个月.每个月除了要还固定的本金外,还要还贷款余额在一个月中产生的利息.假设月利 ...

  10. mysql最小费用最大流问题_算法笔记_140:最小费用最大流问题(Java)

    packagecom.liuzhen.practice;importjava.util.ArrayList;importjava.util.Scanner;public classMain {publ ...

最新文章

  1. linux shell之cut用法
  2. 与通用计算机相比 单片机具体有哪些特点,嵌入式系统-复习大纲_彭荣
  3. 444 nginx_nginx 安全问题
  4. source insight(SI)怎么显示全路径?(不显示省略路径)(关闭Trim long path names with ellipses)
  5. bzoj 1670 [Usaco2006 Oct]Building the Moat护城河的挖掘——凸包
  6. 用php生成HTML文件的类
  7. ad采样做按键开关_电池应用中的电流采样电阻设计
  8. (五)从头开始构建风格迁移CycleGAN
  9. 机器学习与计算机视觉(深度学习)
  10. C# 对称算法,加密解密类
  11. 100个最受欢迎的机器学习课程视频
  12. windows idea Tomcat端口被占用
  13. linux制作U盘启动盘无法使用,完美:使用syslinux制作U盘启动盘
  14. Refresh PDB
  15. 7年弹指一挥间:iOS演进史
  16. 京东商品数据分析,教你一键分析数据
  17. BIOS中VT虚拟技术已经开启,但任务管理器中仍显示虚拟化已禁用
  18. 石油化工行业智能供应链管理系统解决方案:数智化供应链平台推动企业转型智能化发展
  19. 75个JavaScript面试题集锦,内含解答,自测 JS 掌握程度
  20. Tagged Pointer分析

热门文章

  1. 递归,yield,参数槽
  2. IOS恢复备份使用帮助
  3. 与 SQL Server 建立连接时出现与网络相关的或特定于实例的错误
  4. 面试遇Spark,别怂!
  5. 如何准备 Java 初级和高级的技术面试
  6. 数据库之互联网常用架构方案一览
  7. 小米IPO前员工写文爆料内部真实见闻—期权 部分裁员 离职大公开!
  8. Java高效开发12个精品库
  9. Nginx 性能调优
  10. 你真的会调试 Linux 内核故障吗,看完这一篇后你会茅塞顿开的!