#include<stdio.h>
#include<queue>
#define M 1007
using namespace std;
int pref[M][M],order[M][M],next[M];
int future_husband[M],future_wife[M];
queue<int>q;
//订婚
void engage(int man,int women)
{
int m=future_husband[women];
if(m)//女士有现任丈夫m
{
future_wife[m]=0;//抛弃他
q.push(m);//m加入为订婚的男士队列
}
future_husband[women]=man;
future_wife[man]=women;
}
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++)
{
int x;
for(int j=1;j<=n;j++)
{
scanf("%d",&x);
order[i][x]=j;//在编号为i的女士心目中,编号为x的男士的排名
}
future_husband[i]=0;//没有未婚夫
}
while(!q.empty())
{
int man=q.front();
q.pop();
int women=pref[man][next[man]++];//下一个求婚对象
if(!future_husband[women])//女士没有未婚夫,直接订婚
engage(man,women);
else if(order[women][man]<order[women][future_husband[women]])//代替女士的现任丈夫
engage(man,women);
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;
}
稳定婚姻问题
最新推荐文章于 2021-11-24 09:21:38 发布