#include <stdio.h>
#include <stdlib.h>
#define N 5
#define MAXSIZE 100
int main()
{
int man[MAXSIZE][MAXSIZE],woman[MAXSIZE][MAXSIZE];
int num_n,num_v;
char person[10][10]={"0","1","2","3","4","5","6","7","8","9"};
printf("请输入男生的数量,和女生的数量\n");
scanf("%d%d",&num_n,&num_v);
printf("请输入男士的心中对于女生的排名矩阵,以序号表示\n");
for(int i=0;i<num_n;i++){
for(int j=0;j<num_v;j++){
scanf("%d",&man[i][j]);
}
}
printf("请输入女生的心中对于男生的排名矩阵,以序号表示\n");
for(int i=0;i<num_v;i++){
for(int j=0;j<num_n;j++){
scanf("%d",&woman[i][j]);
}
}
// int man[N][N]=
// {
// {7,6,9,5,8},
// {5,6,9,7,8},
// {8,7,6,5,9},
// {5,7,8,6,9},
// {5,6,8,9,7}
// };
// int woman[N][N]=
// {
// {2,4,1,0,3},
// {4,1,0,3,2},
// {3,2,4,0,1},
// {0,1,2,3,4},
// {1,2,3,0,4}
// };
// 用于存放男性所选取的对应女性的索引
int isppN[MAXSIZE]= {-1,-1,-1,-1,-1};//size=num_n
// 用于存放女性所选取的对应男性的索引//size=num_v
int isppV[MAXSIZE]= {-1,-1,-1,-1,-1};
for(int i=0;i<MAXSIZE;i++){
isppN[i]=-1;
isppV[i]=-1;
}
int NoPp[30];//记录男士的索引
int font=0,rear=0;//队列指针
int index;//索引记录
int firstpp,afterpp;//标志暂存
//将没有进行匹配的人放入队列中
for(int i=0; i<num_n; i++)
{
if(isppN[i]==-1)
{
NoPp[rear++]=i;
}
}
//遍历队列
while(rear!=font)
{
//获取索引
index=NoPp[font++];
//遍历男性渴望配对的女性
for(int k=0; k<num_n; k++)
{
// 如果该女性没有伴侣则将两者配对
if(isppV[man[index][k]-num_n]==-1)
{
isppN[index]=man[index][k];
isppV[man[index][k]-num_n]=index;
break;
}
else
{
//否则便在女性中选取最优的男性与之配对
for(int j=0; j<num_n; j++)
{
if(woman[man[index][k]-num_n][j]==isppV[man[index][k]-num_n])
{
firstpp=j;
}
else if(woman[man[index][k]-num_n][j]==index)
{
afterpp=j;
}
}
//选取的男性已经是最优,进入下一次循环
if(firstpp<afterpp)
{
// Nopp[rear++]=index;
continue;
}
else
{
//否则将内容修改为对应最优人选,该男性自动成为未匹配男性
NoPp[rear++]=isppV[man[index][k]-num_n];
isppN[index]=man[index][k];
isppV[man[index][k]-num_n]=index;
break;
}
}
}
}
for(int t=0; t<num_n; t++)
{
if(isppN[t]==-1){
printf("%s无匹配对象\n",person[t]);
}else{
printf("%s匹配%s\n",person[t],person[isppN[t]]);
}
}
return 0;
}
婚姻匹配问题算法设计
最新推荐文章于 2022-06-05 21:44:53 发布