稳定婚姻小模版(来自HDU)
稳定婚姻是二分图匹配的一种
原模版几个变量有问题 进行过修正 贴代码如下:
#include <iostream>
#include <queue>
using namespace std;
#define MAX 1010
int n;
int mlove[MAX][MAX];
int wlove[MAX][MAX];
int couple[MAX];
int pare[MAX];
queue < int > SQ;
void gale_shapley()
{
int i,man,woman;
while(!SQ.empty())
SQ.pop();
memset(couple, -1, sizeof(couple));
for(i=1;i<=n;i++)
SQ.push(i);
while(!SQ.empty())
{
man = SQ.front();
SQ.pop();
for(i=1;i<=n;i++)
{
if(mlove[man][i] != -1)//如男生未选择过该女生
{
//选择未被拒绝且最喜欢的女生
woman = mlove[man][i];//挑选最喜欢的女生
mlove[man][i] = -1;//选择并标记之
long pre = couple[woman];
if(pre == -1) //若没有女生未配对
{
couple[woman] = man;//撮合之
pare[man] = woman;//撮合之
break;
}
else //若已配对
{
if(wlove[woman][man] > wlove[woman][pre])//如果女生喜欢这个男生超过现在的
{
SQ.push(pre);//把现在的放到队列里
couple[woman] = man;//撮合之
pare[man] = woman;//撮合之
break;
}
}
}
}
}/while
}
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;//记录喜欢程度从大到小
}
}
gale_shapley();
for(i = 1; i <= n; i++)
printf("%d\n", pare[i]);//对于男方的配偶
}
return 0;
}
#include <queue>
using namespace std;
#define MAX 1010
int n;
int mlove[MAX][MAX];
int wlove[MAX][MAX];
int couple[MAX];
int pare[MAX];
queue < int > SQ;
void gale_shapley()
{
int i,man,woman;
while(!SQ.empty())
SQ.pop();
memset(couple, -1, sizeof(couple));
for(i=1;i<=n;i++)
SQ.push(i);
while(!SQ.empty())
{
man = SQ.front();
SQ.pop();
for(i=1;i<=n;i++)
{
if(mlove[man][i] != -1)//如男生未选择过该女生
{
//选择未被拒绝且最喜欢的女生
woman = mlove[man][i];//挑选最喜欢的女生
mlove[man][i] = -1;//选择并标记之
long pre = couple[woman];
if(pre == -1) //若没有女生未配对
{
couple[woman] = man;//撮合之
pare[man] = woman;//撮合之
break;
}
else //若已配对
{
if(wlove[woman][man] > wlove[woman][pre])//如果女生喜欢这个男生超过现在的
{
SQ.push(pre);//把现在的放到队列里
couple[woman] = man;//撮合之
pare[man] = woman;//撮合之
break;
}
}
}
}
}/while
}
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;//记录喜欢程度从大到小
}
}
gale_shapley();
for(i = 1; i <= n; i++)
printf("%d\n", pare[i]);//对于男方的配偶
}
return 0;
}