感觉这个问题还是蛮有趣的,照着书上敲了一遍,时间复杂度O(n2)。留存作模版
#include <cstdio>
#include <queue>
using namespace std;
const int maxn = 1000 + 10;
int pref[maxn][maxn],order[maxn][maxn],next[maxn];
int future_husband[maxn],future_wife[maxn];
queue<int> q;
void engage(int man,int woman){
int m = future_husband[woman];
if(m){//女士现有未婚夫m
future_wife[m] = 0;//抛弃m
q.push(m);//m加入未婚男士行列
}
future_wife[man] = woman;
future_husband[woman] = man;
}
int main(){
int T;
scanf("%d",&T);
while(T--){
int n;
scanf("%d",&n);
for(int i = 1;i <= n;i++){
for(int j = 1;j <= n;j++)
scanf("%d",&pref[i][j]);//编号为i的男士第j喜欢的人
next[i] = 1;//接下来向排名为1的女士求婚
future_wife[i] = 0;//没有未婚妻
q.push(i);
}
for(int i = 1;i <= n;i++){
for(int j = 1;j <= n;j++){
int x;
scanf("%d",&x);
order[i][x] = j;//编号为i的女士心目中,编号为x的男士的排名
}
future_husband[i] = 0;//没有未婚夫
}
while(!q.empty()){
int man = q.front();q.pop();
int woman = pref[man][next[man]++];//下一个求婚对象
if(!future_husband[woman])//女士没有订婚,直接结婚
engage(man,woman);
else if(order[woman][man] < order[woman][future_husband[woman]])
engage(man,woman);//代替女士现任未婚夫
else q.push(man);//被拒,去进行后一位的求婚
}
while(!q.empty()) q.pop();
for(int i = 1;i <= n;i++) printf("%d\n",future_wife[i]);
if(T) printf("\n");
}
return 0;
}