c++解决稳定匹配问题

本文介绍了一种由男方发起的G-S稳定匹配算法,通过输入男人和女人的优先列表,程序实现男人的选择过程,最终输出每个男人的匹配对象。算法涉及队列操作和优先级比较。
摘要由CSDN通过智能技术生成

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

评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

打赏作者

韩敬之

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

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

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

打赏作者

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

抵扣说明:

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

余额充值