stable matching machine 问题之c++面向对象

有N男N女,每个人都按照他对异性的喜欢程度排名。现在需要写出一个算法安排这N个男的、N个女的结婚,要求两个人的婚姻应该是稳定的。

            何为稳定?

            有两对夫妻M1 F2,M2 F1。M1心目中更喜欢F1,但是他和F2结婚了,M2心目中更喜欢F2,但是命运却让他和F1结婚了,显然这样的婚姻是不稳定的,随时都可能发生M1和F1私奔或者M2和F2私奔的情况。所以在做出匹配选择的时候(也就是结婚的时候),我们需要做出稳定的选择,以防这种情况的发生。

#include<iostream>
#include<vector>
using namespace std;

class People{
private:
	int id;
	int size;
	int rank[100]; //n<100
	int friend_id;
	int friend_rank;
public:
	People(int i, int n){ id = i; size = n; };
	void setRank(int* s);
	void setFriend(int i, int r);
	int getFriendRank(){ return friend_rank; }; //now friend's rank
	int getFriend(){ return friend_id; };
	int getRank(int ii); //some people's rank according to id
	int get(int ii);//get id according to rank
	int getId(){ return id; };
};

void People::setRank(int* s){
	for (int i = 0; i<size; i++){
		rank[i] = s[i];
	}
}

void People::setFriend(int i, int r){
	friend_id = i;
	friend_rank = r;
}

int People::getRank(int ii){
	for (int i = 0; i<size; i++){
		if (rank[i] == ii)
			return i;
	}
}

int People::get(int ii){
	return rank[ii];
}

int IsFinish(vector<People> boys){
	for (int i = 0; i < boys.size(); i++){
		if (boys.at(i).getFriend() == -1)
			return i;
	}
	return -1;
}

int main(){
	vector<People> boys;
	vector<People> girls;
	int n; //the number of boys/girls
	cin >> n;
	for (int i = 0; i<n; i++){
		int id;
		int rank[100];
		for (int j = 0; j<n; j++){
			cin >> rank[j];
		}
		People tmp(i, n);
		tmp.setRank(rank);
		tmp.setFriend(-1, n);
		boys.push_back(tmp);
	}
	for (int i = 0; i<n; i++){
		int id;
		int rank[100];
		for (int j = 0; j<n; j++){
			cin >> rank[j];
		}
		People tmp(i, n);
		tmp.setRank(rank);
		tmp.setFriend(-1, n);
		girls.push_back(tmp);
	}
	int i;
	while ((i = IsFinish(boys)) != -1){
			for (int j = 0; j < n; j++){
				int id = boys.at(i).get(j);
				if (girls.at(id).getRank(i) < girls.at(id).getFriendRank()){
					int old_id = girls.at(id).getFriend();
					girls.at(id).setFriend(i, girls.at(id).getRank(i));
					boys.at(i).setFriend(id, boys.at(i).getRank(j));
					if (old_id!=-1)
					 boys.at(old_id).setFriend(-1, n);
					break;
				}
			}
	}
	cout << "boy" << "   " << "girl" << endl; 
	for (i = 0; i<n; i++)
		cout << boys.at(i).getId() << '\t' << boys.at(i).getFriend() << endl;
	return 0;
}
感觉写的略复杂,很多都适用stack来写的

  • 0
    点赞
  • 2
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值