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