思路
稳定婚姻问题,可以直接应用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(""); } }