#include<cstdio>
#include<queue>
#include<cstring>
using namespace std;
#define N 1010
int n;
int mlove[N][N]; //第i个男生他最喜欢的第j个女生的编号
int wlove[N][N]; //第i个女生喜欢编号为j的男生的程度
int couple[N]; //记录女生i选择的男生编号
int pare[N]; //记录男生i选择的女生编号
queue<int>Q;
void Stablematch()
{
int i,man,woman;
while(!Q.empty())
Q.pop();
memset(couple,-1,sizeof(couple));
for(i=1;i<=n;i++)
Q.push(i);
while(!Q.empty())
{
man=Q.front();
Q.pop();
for(i=1;i<=n;i++)
{
if(mlove[man][i] != -1)//如男生未选择过该女生
{
//选择未被拒绝且最喜欢的女生
woman = mlove[man][i];//挑选最喜欢的女生
mlove[man][i] = -1;//选择并标记之
int pre = couple[woman];
if(pre == -1) //若没有女生未配对
{
couple[woman] = man;//撮合之
pare[man] = woman;//撮合之
break;
}
else //若已配对
{
if(wlove[woman][man] > wlove[woman][pre])//如果女生喜欢这个男生超过现在的
{
Q.push(pre);//把现在的放到队列里
couple[woman] = man;//撮合之
pare[man] = woman;//撮合之
break;
}
}
}
}
}
}
int main()
{
int i, j, t, hj;
scanf("%d", &t);
while(t--)
{
scanf("%d", &n);
for(i = 1; i <= n; i++)
{
for(j = 1; j <= n; j++)
{
scanf("%d", &mlove[i][j]);//记录喜欢的人的号码
}
}
for(i = 1; i <= n; i++)
{
for(j = 1; j <= n; j++)
{
scanf("%d", &hj);
wlove[i][hj] = n - j;//记录喜欢程度从大到小
}
}
Stablematch();
for(i = 1; i <= n; i++)
printf("%d\n", pare[i]);//对于男方的配偶
}
return 0;
}
稳定婚姻匹配(转)
最新推荐文章于 2022-12-28 23:40:18 发布