天天写算法之(婚姻稳定)The Stable Marriage Problem

地址: 点击打开链接

和上一题目一样的操作,代码:

#include<string.h>
#include<iostream>
#include<stdio.h>
#include<string>
#include<map>
#include<queue>
using namespace std;
#define N 27
char s[N][N];
int b[N][N],g[N][N],Hash[N];
int bM[N],gM[N],Rank[N];
int n;
queue<int>q;

int main()
{
	char str[N];
	int T,t1,t2,i,j,flag,t;

//	freopen("test.txt","r",stdin);
	scanf("%d",&T);
	while(T--)
	{
		scanf("%d",&n);
		memset(bM,0,sizeof(bM));//配对
		memset(gM,0,sizeof(gM));
		memset(Hash,0,sizeof(Hash));

		for(i=1;i<=n;i++)
		{
			scanf("%s",str);
			Hash[str[0]-'a'+1]=1;//标记男生
		}

		for(i=1;i<=n;i++)
			scanf("%s",str);

		for(i=1;i<=n;i++)
		{
			scanf("%s",s[i]);
			t=s[i][0]-'a'+1; //男生
			for(j=1;j<=n;j++)
			{
				b[t][j]=s[i][j+1]-'A'+1;//男生喜欢的女生排序
			}
			Rank[t]=1;//男生从第1个女生(最喜欢的)开始挑选
			bM[t]=0;//男生还未匹配任何女生
			q.push(t);//男生入队
		}

		for(i=1;i<=n;i++)
		{
			scanf("%s",s[i]);
			t=s[i][0]-'A'+1;//女生
			for(j=1;j<=n;j++)
			{
				g[t][s[i][j+1]-'a'+1]=j;//女生喜欢的男生排名
			}
			gM[t]=0;//女生未匹配男生
		}
		while(!q.empty())
		{
			i=q.front();//i表示男生
			q.pop();

			t=b[i][Rank[i]++];//按顺序挑选女生
			if(!gM[t])//女生没有男朋友
			{
				gM[t]=i;
				bM[i]=t;
			}
			else if(g[t][i]<g[t][gM[t]])//女生有男朋友,但是更喜欢i
			{
				bM[gM[t]]=0;//该男生自由
				q.push(gM[t]);//入队
				gM[t]=i;
				bM[i]=t;
			}
			else
				q.push(i);
		}

		for(i=1;i<=26;i++)
		{
			if(Hash[i])//按字母顺序输出,hash[i]=1表示男生
				printf("%c %c\n",i-1+'a',bM[i]-1+'A');
		}
		if(T!=0)
			printf("\n");
	}
	return 0;
}

猜你喜欢

转载自blog.csdn.net/qq_36616268/article/details/80557530
今日推荐