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);
}
}
运行结果:
1 0 2
2 0
1 0
2 0
0 1
2 0
男士0和女士0配对
男士1和女士2配对
男士2和女士1配对
Java实现稳定婚姻问题的更多相关文章
- 算法笔记_138:稳定婚姻问题(Java)
目录 1 问题描述 2 解决方案 1 问题描述 何为稳定婚姻问题? 有一个男士的集合Y = {m1,m2,m3...,mn}和一个女士的计划X = {n1,n2,n3,...,nn}.每一个男士有 ...
- HDU1522 稳定婚姻匹配 模板
Marriage is Stable Time Limit: 2000/1000 MS (Java/Others) Memory Limit: 65536/32768 K (Java/Other ...
- 【HDU1914 The Stable Marriage Problem】稳定婚姻问题
题目链接:http://acm.hdu.edu.cn/showproblem.php?pid=1914 题目大意:问题大概是这样:有一个社团里有n个女生和n个男生,每位女生按照她的偏爱程度将男生排序, ...
- UVA 1175 Ladies' Choice 稳定婚姻问题
题目链接: 题目 Ladies' Choice Time Limit: 6000MS Memory Limit: Unknown 64bit IO Format: %lld & %llu 问题 ...
- BZOJ2140: 稳定婚姻
题解: 题意就是求二分图的必须边. 我们有结论: 在残量网络上跑tarjan,对于一条边(u,v) 如果该边满流||scc[u]==scc[v],那么该边是可行边. 因为如果scc[u]==scc[v ...
- 【POJ 3487】 The Stable Marriage Problem (稳定婚姻问题)
The Stable Marriage Problem Description The stable marriage problem consists of matching members o ...
- 【UVAlive 3989】 Ladies' Choice (稳定婚姻问题)
Ladies' Choice Teenagers from the local high school have asked you to help them with the organizatio ...
- 【稳定婚姻问题】【HDU1435】【Stable Match】
2015/7/1 19:48 题意:给一个带权二分图 求稳定匹配 稳定的意义是对于某2个匹配,比如,( a ---- 1) ,(b----2) , 如果 (a,2)<(a,1) 且(2,a)& ...
- poj 3487 稳定婚姻
/** 稳定婚姻:男生不停的求婚,女生不停地拒绝 **/ #include <iostream> #include <queue> #include <cstdio> ...
随机推荐
- HTTP Strict Transport Security (通常简称为HSTS)
HTTP Strict Transport Security (通常简称为HSTS) 是一个安全功能,它告诉浏览器只能通过HTTPS访问当前资源, 禁止HTTP方式. Freebuf百科:什么是Str ...
- HDU 2010 (水)
题目链接:http://acm.hdu.edu.cn/showproblem.php?pid=2010 题目大意:给你段连续的数,把满足条件(数字 每一位的3 == 该数字)的数输出,就是水仙花数 解 ...
- markdonwn 测试1
标题测试 ## 二级标题 ### 三级标题 二级标题 三级标题 段落格式 换行 末尾两个空格 第一行第一行第一行第一行第一行第一行第一行第一行 第二行第二行第二行第二行第二行第二行第二行第二行 第一行 ...
- JUC并发基础
目录 一.Volatile 0.基础知识 1. volatile的解释 3.volatile的应用 二.CAS 0.CAS的定义 1.CAS底层原理 2.CAS的缺点 3.ABA问题 三.集合类并发安 ...
- Python-MD5加密算法接口测试
前言 在之前的Python系列的随笔中,我跟小伙伴们讲述了Python-AES加密算法接口测试和Python-SHA256加密算法接口测试,今天我们来学习一下登录密码是md5加密的情况下,该如何使用p ...
- 「雕爷学编程」Arduino动手做(32)——雨滴传感器模块
37款传感器与模块的提法,在网络上广泛流传,其实Arduino能够兼容的传感器模块肯定是不止37种的.鉴于本人手头积累了一些传感器和模块,依照实践出真知(一定要动手做)的理念,以学习和交流为目的,这里 ...
- 走进WebApiClientCore的设计
WebApiClient WebApiClient是NCC开源社区的一个项目,是目前微服务里http接口调用的一把锋利尖刀,项目早期设计与开发的时候,是基于.netframework的,然后慢慢加入n ...
- 华为Mate8手机优化技巧
我的华为Mate8手机手机存储(手机内存)32G, 运行内存3G,2016年买的手机,两样数值都偏小,导致使用手机的时候经常卡顿,一天来回清理垃圾.清理内存很多次,要运行微信.QQ等占用运行内存较多的 ...
- 爬虫之requests的请求与响应
requests是基于urllib3的一个用于发起http请求的库(中文文档)数据采集流程: 指定url>> 基于 requests模块发起请求>> 获取响应中的数据>& ...
- EF Join连接查询的坑
最近做项目的时候遇到一个需要级联查询的数据,表中又没有定义相关的外键约束,所以限定了咱们只能使用Join方式的关联而不是Include的方式关联,关于Include和Join的详细用法,本屌就不再此处 ...