算法笔记_138:稳定婚姻问题(Java)
目录
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);
}
}
运行结果:
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 著 潘彦 译
算法笔记_138:稳定婚姻问题(Java)的更多相关文章
- 算法笔记_023:拓扑排序(Java)
目录 1 问题描述 2 解决方案 2.1 基于减治法实现 2.2 基于深度优先查找实现 1 问题描述 给定一个有向图,求取此图的拓扑排序序列. 那么,何为拓扑排序? 定义:将有向图中的顶点以线性方式进 ...
- 算法笔记_228:信用卡号校验(Java)
目录 1 问题描述 2 解决方案 1 问题描述 当你输入信用卡号码的时候,有没有担心输错了而造成损失呢?其实可以不必这么担心,因为并不是一个随便的信用卡号码都是合法的,它必须通过Luhn算法来验证 ...
- 算法笔记_137:二分图的最大匹配(Java)
目录 1 问题描述 2 解决方案 1 问题描述 何为二分图的最大匹配问题? 引用自百度百科: 首先得说明一下何为匹配: 给定一个二分图G,在G的一个子图M中,M的边集{E}中的任意两条边都不依附于 ...
- 算法笔记_132:最大流量问题(Java)
目录 1 问题描述 2 解决方案 1 问题描述 何为最大流量问题? 给定一个有向图,并为每一个顶点设定编号为0~n,现在求取从顶点0(PS:也可以称为源点)到顶点n(PS:也可以称为汇点)后,顶点 ...
- 算法笔记_040:二进制幂(Java)
目录 1 问题描述 2 解决方案 2.1 从左至右二进制幂 2.2 从右至左二进制幂 1 问题描述 使用n的二进制表示,计算a的n次方. 2 解决方案 2.1 从左至右二进制幂 此方法计算a的n次 ...
- 算法笔记_014:合并排序(Java)
1 问题描述 给定一组数据,使用合并排序得到这组数据的非降序排列. 2 解决方案 2.1 合并排序原理简介 引用自百度百科: 合并排序是建立在归并操作上的一种有效的排序算法.该算法是采用分治法(Div ...
- 算法笔记_233:二阶魔方旋转(Java)
目录 1 问题描述 2 解决方案 1 问题描述 魔方可以对它的6个面自由旋转. 我们来操作一个2阶魔方(如图1所示): 为了描述方便,我们为它建立了坐标系. 各个面的初始状态如下:x轴正向:绿x轴 ...
- 算法笔记_227:填写乘法算式(Java)
目录 1 问题描述 2 解决方案 1 问题描述 观察下面的算式: * * × * * = * * * 它表示:两个两位数字相乘,结果是3位数.其中的星号(*)代表任意的数字,可以相同,也可以不同, ...
- 算法笔记_225:数字密码发生器(Java)
目录 1 问题描述 2 解决方案 1 问题描述 在对银行账户等重要权限设置密码的时候,我们常常遇到这样的烦恼:如果为了好记用生日吧,容易被破解,不安全:如果设置不好记的密码,又担心自己也会忘记:如 ...
随机推荐
- 清北学堂学习总结 day1 数据结构 练习
1.二叉搜索树 STL set直接做就可以了 2.树状数组+差分数列: codevs 1081 线段树练习 2 时间限制: 1 s 空间限制: 128000 KB 题目等级 : 大师 Maste ...
- 内功心法 -- java.util.LinkedList<E> (2)
写在前面的话:读书破万卷,编码如有神--------------------------------------------------------------------下文主要对java.util ...
- mybatis源码分析(4)----org.apache.ibatis.binding包
1. 我们通过接口操作数据库时,发现相关的操作都是在org.apache.ibatis.binding下 从sqSessin 获取getMapper() SqlSession session = s ...
- Android中数据存储(四)——ContentProvider存储数据
目录(?)[+] 当一个应用程序在Android中安装后,我们在使用应用的过程中会产生很多的数据,应用都有自己的数据,那么我们应该如何存储数据呢? 数据存储方式 Android 的数据存储有5种方 ...
- 移动应用安全开发指南(Android)--完结篇
如果IE显示格式不正常,请使用chrome浏览器 1.认证和授权 概述 认证是用来证明用户身份合法性的过程,授权是用来证明用户可以合法地做哪些事的过程,这两个过程一般是在服务器端执行的,但也有的APP ...
- HDFS API基本操作
对HDFS API基本操作都是通过 org.apache.hadoop.fs.FileSystem类进行的,以下是一些常见的操作: package HdfsAPI; import java.io.Bu ...
- Visual SVN 企业版代码管理平台的建设
通常需要完整的SVN的代码管理平台系统的搭建,需要安装三个文件,Visual SVN server , TortoiseSVN, Visual SVN. Visual SVN server 企业版 ...
- golang的缓冲channel和无缓冲channel的区别
话说golang的channel同步的定义真是让人无力吐槽,码农的用户体验就这么难搞么,超耐磨阿,无缓冲和缓冲居然有这么大区别....靠 转载一段网上的资料 --------------------- ...
- PHP 输出数据库中文是问号
- easyui datagrid如何获取到每行的文本框
在return '<input type="text" name="txtCount" class="inputvalue"/> ...