有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来写的