思路
稳定婚姻问题,可以直接应用Gale-Shapley算法求解。
看到没人交我也不写了,抄了一下林厚从的板子,注释很清楚了。
代码
#include<stdio.h>
#include<queue>
#include<cstring>
#include<algorithm>
using namespace std;
#define N 35
#define inf 1<<29
#define MOD 2007
#define LL long long
using namespace std;
int couple;
int malelike[N][N],femalelike[N][N];
int malechoice[N],femalechoice[N];
int malename[N],femalename[N];
char str[N];
queue<int>freemale;
signed main(){
int t;
scanf("%d",&t);
while(t--){
scanf("%d",&couple);
//情况队列
while(!freemale.empty()){
freemale.pop();
}
//将男士的名字存下,初始都没有匹配
for(int i=0;i<couple;i++){
scanf("%s",str);
malename[i]=str[0]-'a';
freemale.push(malename[i]);
}
//将名字排序,便于字典序
sort(malename,malename+couple);
for(int i=0;i<couple;i++){
scanf("%s",str);
femalename[i]=str[0]-'A';
}
//男士对女士的印象,按降序排列
for(int i=0;i<couple;i++){
scanf("%s",str);
for(int j=0;j<couple;j++){
malelike[i][j]=str[j+2]-'A';
}
}
//女士对男士的打分,添加虚拟人物,编号couple,为女士的初始对象
for(int i=0;i<couple;i++){
scanf("%s",str);
for(int j=0;j<couple;j++) femalelike[i][str[j+2]-'a']=couple-j;
femalelike[i][couple]=0;
}
//一开始男士的期望都是最喜欢的女士
memset(malechoice,0,sizeof(malechoice));
//女士先初始一个对象
for(int i=0;i<couple;i++) femalechoice[i]=couple;
while(!freemale.empty()){
//找出一个未配对的男士,注意不要习惯性的POP
int male=freemale.front();
//男士心仪的女士
int female=malelike[male][malechoice[male]];
//如果当前男士比原来的男友好
if(femalelike[female][male]>femalelike[female][femalechoice[female]]){
//成功***
freemale.pop();
//如果右前男友,则打回光棍,并且考虑下一个对象
//不要把虚拟人物加入队列,否则会死循环或者错误
if(femalechoice[female]!=couple){
freemale.push(femalechoice[female]);
malechoice[femalechoice[female]]++;;
}
//当前男友为这位男士
femalechoice[female]=male;
}else malechoice[male]++;//如果被女士拒绝,则要考虑下一个对象
}
for(int i=0;i<couple;i++){
printf("%c %c\n",malename[i]+'a',malelike[malename[i]][malechoice[malename[i]]]+'A');
}
if(t) puts("");
}
} 
京公网安备 11010502036488号