G-S稳定匹配算法(由男方发起邀请)
第一行数据表示Man(Woman)的数目n; 接下来的数据中,第一个n∗n 的数据块表示Man的优先列表; 另一个n∗n的数据块表示Woman的优先列表。
输出数据一行n个数,表示每个Man的匹配对象。
Sample
Input
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
Output:
1 3 2 5 4
代码
#include<iostream>
#include<queue>
using namespace std;
//男人或女人数量
int num = 0;
class man
{
private:
queue<int>* Priority_man_queue;
public:
int* men_choose;
int* status;
man() {
Priority_man_queue = new queue<int>[num]();
men_choose = new int[num]();
status = new int[num]();
};
man(int** Priority_man_matrix) :man(){
for (int i = 0; i < num; i++)
{
for (int j = 0; j < num; j++)
{
Priority_man_queue[i].push(Priority_man_matrix[i][j]);
}
}
re_men_choose();
}
//第n个男人目前的追求者(在被拒绝前不会改变)
int get_man_choose(int n) { return Priority_man_queue[n - 1].front(); }
//第n个男人被拒绝
void reject_man(int n) { Priority_man_queue[n - 1].pop(); re_men_choose(n); status[n - 1] = 0;}
//第n个男人被接受
void accept_man(int n) { status[n - 1] = 1; }
//更新男人择偶表
void re_men_choose(int n) {
men_choose[n-1] = this->get_man_choose(n);
}
void re_men_choose() {
for (int i = 0; i < num; i++)
{
men_choose[i] = this->get_man_choose(i + 1);
}
}
//打印男人择偶表
void print_men_choose(){
for (int i = 0; i < num; i++)
{
cout << men_choose[i] << " ";
}
}
};
//发出邀请
int invite(man man, int* woman_choose,int mannum, int** Priority_woman_matrix)
{
int who = man.get_man_choose(mannum);
int nowlove = woman_choose[who - 1];
if (nowlove == 0)
{
man.accept_man(mannum);
woman_choose[who - 1] = mannum;
return 0;
}
if (Priority_woman_matrix[who-1][nowlove-1] < Priority_woman_matrix[who-1][mannum-1])
{
man.reject_man(mannum);
return mannum;
}
man.accept_man(mannum);
man.reject_man(nowlove);
woman_choose[who - 1] = mannum;
return nowlove;
}
int main()
{
cin >> num;
//初始化男人优先列表
int** Priority_man_matrix = new int* [num]();
for (int i = 0; i < num; i++)
{
Priority_man_matrix[i] = new int[num]();
}
//queue<int>* Priority_man_queue = new queue<int>[num]();
//初始化女人优先列表
int** Priority_woman_matrix = new int* [num]();
for (int i = 0; i < num; i++)
{
Priority_woman_matrix[i] = new int[num]();
}
//初始化女人配偶表
int* woman_choose=new int[num]();
//定义男人优先列表
for (int i = 0; i < num; i++)
{
for (int j = 0; j < num; j++)
cin >> Priority_man_matrix[i][j];
}
man manins(Priority_man_matrix);
//for (int i = 0; i < num; i++)
//{
// for (int j = 0; j < num; j++)
// {
// int temp=0;
// cin >> temp;
// Priority_man_queue[i].push(temp);
// }
//}
//定义女人优先列表(重整)
for (int i = 0; i < num; i++)
{
for (int j = 0; j < num; j++)
{
int temp = 0;
cin >> temp;
Priority_woman_matrix[i][temp - 1] = j + 1;
}
}
//G-S
for(int i=0;i<num;)
{
int loser = 0;
while (manins.status[i] == 0)
{
loser=invite(manins, woman_choose, i + 1, Priority_woman_matrix);
}
if (loser != 0)
i = loser - 1;
else
i++;
}
manins.print_men_choose();
return 0;
}