The Stable Matching/Marriage Problem

The Stable Matching/Marriage Problem稳定匹配

在这里插入图片描述
在这里插入图片描述

重要的是要根据题目设置变量来描述问题,也就是建模

根据书上的算法步骤:

while 存在男人m是自由的且还没对每个女人都求过婚
    选择这个男人m
    令w是m的优先表中还没求过婚的最高排名的女人
    if w是自由的 
      (m,w)变成约会状态
    else w当前与m1约会
      if w更偏爱m1而不爱m
        m保持自由
      else w更偏爱m而不爱m1
        (m,w)变成约会状态
        m1变成自由
      endif
    endif
 endwhile
import java.util.LinkedList;
import java.util.Queue;
import java.util.Scanner;

public class Main{
    /**
     * @param args
     */
    public static void main(String[] args) {
        int N, K;
        Scanner sc = new Scanner(System.in);
        N = sc.nextInt();
        K = sc.nextInt();//男的编号
        int[][] man = new int[N][N];//男人的对女人的优先顺序
        int[][] woman = new int[N][N];

        int[][] womenOrder = new int[N][N];
        for (int i = 0; i<N; i++){
            for (int j = 0; j<N; j++){
                man[i][j] = sc.nextInt();
            }
        }

        for (int i = 0; i<N; i++){
            for (int j = 0; j<N; j++){
                woman[i][j] = sc.nextInt();
            }
        }

        for (int i = 0; i<N; i++){
            for (int j = 0; j<N; j++){
                //第i个女生喜欢的男生women[i][j]排号为
                womenOrder[i][woman[i][j]] = j; 
            }
            
        }

        //还未配对的男生
        Queue<Integer> freeMan = new LinkedList<>();
        for (int i = 0; i<N; i++){
            freeMan.offer(i);
        }

        int sboy = -1;

        int[] manChoice = new int[N];//第i个男性的选择,都是选择最喜欢的,也就是排序中的第一个
        int[] womanChoice = new int[N];//第i个女性的选择,女生最开始是自由的

        //初始化男的选择,选最好的
        for (int i = 0; i<N; i++){
            manChoice[i] = 0;
        }
        //下标表示女生的编号
        for (int i = 0; i<N; i++){
            womanChoice[i] = -1;
        }

        while (!freeMan.isEmpty()){
            //boy是男生编号
            int boy = freeMan.remove();
            for (int i = 0; i<N; i++){
                //该女生没有男朋友
                if (womanChoice[man[boy][i]]==-1){
                    manChoice[boy] = i;
                    womanChoice[man[boy][i]] = womenOrder[man[boy][i]][boy];
                    break;
                }
                else{
                    //序号小,排名靠前
                    if (womenOrder[man[boy][i]][boy] < womanChoice[man[boy][i]]){
                        sboy = woman[man[boy][i]][womanChoice[man[boy][i]]];
                        //将被抛弃的重新加到队列
                        freeMan.offer(sboy);
                        manChoice[sboy] = 0;
                        manChoice[boy] = i;
                        womanChoice[man[boy][i]] = womenOrder[man[boy][i]][boy];
                        break;
                    }
                }
            }
        }

        System.out.println(man[K][manChoice[K]]);

    }
}

都有注释,应该比较好理解(为啥用Java因为C已经不会了)
在这里插入图片描述

  • 1
    点赞
  • 2
    收藏
    觉得还不错? 一键收藏
  • 打赏
    打赏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

BUG--ER

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值