请完成G-S稳定匹配算法(由男方发起邀请)
第一行数据表示Man(Woman)的数目n; 接下来的数据中,第一个n*nn∗n 的数据块表示Man的优先列表; 另一个n*nn∗n 的数据块表示Woman的优先列表。
输出数据一行nn个数,表示每个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
测试数据范围:
2\leq n\leq 302≤n≤30
#include<iostream>
using namespace std;
//是否有单身的男人的判断函数
bool man_free(bool*man_state, int n, int&index) {
for (int i = 0; i < n; i++) {
if (man_state[i] == false) {
index = i;
return true;
}
}
return false;
}
//该男人是否和所有女人求过婚
bool man_no_date(bool**man_date, int n, int index) {
for (int i = 0; i < n; i++) {
if (man_date[index][i] == false) {
return true;
}
}
return false;
}
//寻找没求过婚的女人中排名最高的女人
int find_highest_woman(bool**man_date, int**man, int n, int theman) {
for (int i = 0; i < n; i++) {
int tmpwoman = man[theman][i];
if (man_date[theman][tmpwoman] == false) {
return tmpwoman;
}
}
return -1;
}
int main() {
//进行输入
int n;
int**man, **woman;
cin >> n;
man = new int*[n];
woman = new int*[n];
for (int i = 0; i < n; i++) {
man[i] = new int[n];
woman[i] = new int[n];
}
for (int i = 0; i < n; i++) {
for (int j = 0; j < n; j++) {
cin >> man[i][j];
man[i][j]--;
}
}
for (int i = 0; i < n; i++) {
for (int j = 0; j < n; j++) {
int num;
cin >> num;
woman[i][num - 1] = j;
}
}
//初始化记录男人女人单身状态的bool数组和记录男人向女人求婚的数组
bool*man_state, *woman_state;
bool**date;
man_state = new bool[n];
for (int i = 0; i < n; i++) {
man_state[i] = false;
}
woman_state = new bool[n];
for (int i = 0; i < n; i++) {
woman_state[i] = false;
}
date = new bool*[n];
for (int i = 0; i < n; i++) {
date[i] = new bool[n];
}
for (int i = 0; i < n; i++) {
for (int j = 0; j < n; j++) {
date[i][j] = false;
}
}
//初始化记录男人女人配对的数组
int*woman_man_pair = new int[n];
for (int i = 0; i < n; i++) {
woman_man_pair[i] = -1;
}
//GS算法主体部分
int index = 0;
while (man_free(man_state, n, index) && man_no_date(date, n, index)) {
int theman = index;
int thewoman = find_highest_woman(date, man, n, theman);
date[theman][thewoman] = true;
if (woman_state[thewoman] == false) {
woman_man_pair[thewoman] = theman;
woman_state[thewoman] = true;
man_state[theman] = true;
}
else {
int theother = woman_man_pair[thewoman];
if (woman[thewoman][theother] < woman[thewoman][theman]) {
continue;
}
else {
woman_man_pair[thewoman] = theman;
man_state[theman] = true;
man_state[theother] = false;
}
}
}
for (int i = 0; i < n; i++) {
for (int j = 0; j < n; j++) {
if (woman_man_pair[j] == i) {
cout << j + 1 << " ";
break;
}
}
}
return 0;
}