算法笔记_138:稳定婚姻问题(Java)
目录
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)相关推荐
- 算法笔记_132:最大流量问题(Java)
目录 1 问题描述 2 解决方案 1 问题描述 何为最大流量问题? 给定一个有向图,并为每一个顶点设定编号为0~n,现在求取从顶点0(PS:也可以称为源点)到顶点n(PS:也可以称为汇点)后,顶点 ...
- 算法笔记_137:二分图的最大匹配(Java)
目录 1 问题描述 2 解决方案 1 问题描述 何为二分图的最大匹配问题? 引用自百度百科: 首先得说明一下何为匹配: 给定一个二分图G,在G的一个子图M中,M的边集{E}中的任意两条边都不依附于 ...
- 金九银十面试即将到来!字节内部数据结构与算法笔记,限时上线,Java程序员们准备好了吗?
前言 不得不说,现在几乎所有的大厂,比如Google.字节.BAT,面试的时候都喜欢考算法.让人现场写代码,那你有没有真正地想过,为什么这些大公司都喜欢考算法呢? 经常有人说,程序员35岁之后很容易陷 ...
- 算法笔记_218:花朵数(Java)
目录 1 问题描述 2 解决方案 1 问题描述 一个N位的十进制正整数,如果它的每个位上的数字的N次方的和等于这个数本身,则称其为花朵数. 例如: 当N=3时,153就满足条件,因为 1^3 + ...
- 排序算法笔记:堆排序 HeapSort in java
2019独角兽企业重金招聘Python工程师标准>>> /*** 堆排序* 简述:* 首先使用建立最大堆的算法建立好最大堆,然后将堆顶元素(最大值)与最后一个值交换,同时使得堆的长度 ...
- java heapsort_排序算法笔记:堆排序 HeapSort in java
/** * 堆排序 * 简述: * 首先使用建立最大堆的算法建立好最大堆,然后将堆顶元素(最大值)与最后一个值交换,同时使得堆的长度减小1 ,调用保持最大堆性质的算法调整,使得堆顶元素成为最大值,此时 ...
- 算法笔记_036:预排序(Java)
目录 1 问题描述 2 解决方案 2.1 检验数组中元素的唯一性 2.2 模式计算 1 问题描述 在计算机科学中,预排序是一种很古老的思想.实际上,对于排序算法的兴趣很大程度上是因为这样一个事实: ...
- 算法笔记_227:填写乘法算式(Java)
目录 1 问题描述 2 解决方案 1 问题描述 观察下面的算式: * * × * * = * * * 它表示:两个两位数字相乘,结果是3位数.其中的星号(*)代表任意的数字,可以相同,也可以不同, ...
- 算法笔记_114:等额本金(Java)
1 等额本金 标题:等额本金小明从银行贷款3万元.约定分24个月,以等额本金方式还款.这种还款方式就是把贷款额度等分到24个月.每个月除了要还固定的本金外,还要还贷款余额在一个月中产生的利息.假设月利 ...
- mysql最小费用最大流问题_算法笔记_140:最小费用最大流问题(Java)
packagecom.liuzhen.practice;importjava.util.ArrayList;importjava.util.Scanner;public classMain {publ ...
最新文章
- linux shell之cut用法
- 与通用计算机相比 单片机具体有哪些特点,嵌入式系统-复习大纲_彭荣
- 444 nginx_nginx 安全问题
- source insight(SI)怎么显示全路径?(不显示省略路径)(关闭Trim long path names with ellipses)
- bzoj 1670 [Usaco2006 Oct]Building the Moat护城河的挖掘——凸包
- 用php生成HTML文件的类
- ad采样做按键开关_电池应用中的电流采样电阻设计
- (五)从头开始构建风格迁移CycleGAN
- 机器学习与计算机视觉(深度学习)
- C# 对称算法,加密解密类
- 100个最受欢迎的机器学习课程视频
- windows idea Tomcat端口被占用
- linux制作U盘启动盘无法使用,完美:使用syslinux制作U盘启动盘
- Refresh PDB
- 7年弹指一挥间:iOS演进史
- 京东商品数据分析,教你一键分析数据
- BIOS中VT虚拟技术已经开启,但任务管理器中仍显示虚拟化已禁用
- 石油化工行业智能供应链管理系统解决方案:数智化供应链平台推动企业转型智能化发展
- 75个JavaScript面试题集锦,内含解答,自测 JS 掌握程度
- Tagged Pointer分析