稳定婚姻匹配

本文详细解析了稳定婚姻匹配问题中的G-S算法,通过具体的样例输入和输出展示了如何使用该算法实现男女双方的最优匹配。文章提供了完整的C++代码实现,包括数据结构定义、匹配过程及结果输出。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

1001: 稳定婚姻匹配

要求按照书中 Page 5 的 G-S 算法写一个匹配程序(由男方发起邀请)。
(第一行数据表示 Man(Woman)的数目 n;接下来的数据中,第一个 n* n 的数据块表示 Man 的优先列表;另一个 n*n 的数据块表示 Woman 的优先列表)
5 ---------------------- (Man(Woman)的数目 n)
2 1 4 5 3 -------------- (第一个男人的优先列表)
4 2 1 3 5
2 5 3 4 1 -------------- (第三个男人的优先列表)
1 4 3 2 5
2 4 1 5 3
5 1 2 4 3 -------------- (第一个女人的优先列表)
3 2 4 1 5
2 3 4 5 1
1 5 4 3 2
4 2 5 3 1
男人 1 到 n 的匹配对象,每个数字后边跟一个空格,最后输出一个\n。
样例输入:
5
2 1 4 5 3
4 2 1 3 5
2 5 3 4 1
1 4 3 2 5
2 4 1 5 3
5 1 2 4 3
3 2 4 1 5
2 3 4 5 1
1 5 4 3 2
4 2 5 3 1
样例输出:
1 3 2 5 4
提示:
测试数据范围:
2 <= n <= 30
总共13个test cases.
样例代码:

#include<iostream>
using namespace std;
class person
{
public:
 int n;
 bool isfree;
 int mate;
 int *prefer;
 int *invite;
public:
 person() {}
 void init(int n)
 {
  this->n = n;
  isfree = true;
  mate = -1;
  prefer = new int[n];
  invite = new int[n];
  for (int i = 0; i < n; i++)
  {
   prefer[i] = 0;
   invite[i] = 0;
  }
 }
};
int finish(person *man)
{
 for (int i = 0; i < man[0].n; i++)
 {
  if (man[i].isfree == true)return (i + 1);
 }
 return 0;
}
bool than(person woman,int m,int m2)//判断woman女性更喜欢哪一个男性,如果是m,返回true,反之false
{
 for (int i = 0; i < woman.n; i++)
 {
  if (woman.prefer[i] == m)return true;
  if (woman.prefer[i] == m2)return false;
 }
}
int main()
{
 int n;
 cin >> n;
 person *man = new person[n];
 person *woman = new person[n];
 for (int i = 0; i < n; i++)
 {
  man[i].init(n);
  woman[i].init(n);
 }
 for (int i = 0; i < n; i++)
 {
  for (int j = 0; j < n; j++)
  {
   int temp;
   cin >> temp;
   man[i].prefer[j]=temp-1;
  }
 }
 for (int i = 0; i < n; i++)
 {
  for (int j = 0; j < n; j++)
  {
   int temp;
   cin >> temp;
   woman[i].prefer[j]=temp-1;
  }
 }
 while (finish(man))
 {
  int m = finish(man) - 1;//ID为m的男性是单身的
  for (int i = 0; i < n; i++)
  {
   if (man[m].invite[i] == 1)continue;//如果第i个已经邀请过
   if (man[m].invite[i] == 0)//m男性没有邀请过第i喜欢的女性
   {
    int f = man[m].prefer[i];//f为ID为m的男性第i喜欢的女性的ID
    if (woman[f].isfree)//如果ID为f的女性正好单身
    {
     man[m].isfree = false;
     man[m].invite[i] = 1;
     man[m].mate = f;
     woman[f].isfree = false;
     woman[f].mate = m;
     break;
    }
    else
    {
     int m2 = woman[f].mate;//m2为ID为f的女性现在的配偶的ID
     if (than(woman[f], m, m2))//如果f更喜欢m
     {
      man[m].isfree = false;
      man[m].invite[i] = 1;
      man[m].mate = f;
      woman[f].isfree = false;
      woman[f].mate = m;
      man[m2].isfree = true;
      man[m2].mate = -1;
      break;
     }
     else
     {
      man[m].invite[i] = 1;
      continue;
     }
    }
   }
  }
 }
 for (int i = 0; i < n; i++)
 {
  cout << man[i].mate+1 << " ";
 }
 cout <<  endl;
}
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

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

余额充值