首页 >> 大全

Java实现稳定婚姻问题

2023-06-21 大全 47 作者:考证青年

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);}
}

运行结果:

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

关于我们

最火推荐

小编推荐

联系我们


版权声明:本站内容由互联网用户自发贡献,该文观点仅代表作者本人。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如发现本站有涉嫌抄袭侵权/违法违规的内容, 请发送邮件至 88@qq.com 举报,一经查实,本站将立刻删除。备案号:桂ICP备2021009421号
Powered By Z-BlogPHP.
复制成功
微信号:
我知道了