首页 > 代码库 > 稳定婚姻问题

稳定婚姻问题

原题POJ 3487

稳定婚姻问题的解法,男士主动,女士被动,每次找一个光棍的男士对他最满意的女士求婚,如果女士是未婚或者女士当前的未婚夫在女士心目中不如他,就把男士定为女士的未婚夫,一直进行循环。

#include<stdio.h>
#include<string.h>
#include<algorithm>
#include<iostream>
#include<queue>
#define maxn 1000
using namespace std;
int pref[maxn][maxn];
int prem[maxn][maxn];
int future_h[maxn],future_w[maxn];
int next[maxn];
int numh[30],numw[30];
char numw1[30];
queue<int> q;
char ss[1005];
void maried(int h,int w)
{
     int m=future_h[w];
	 if(m)
	 {
	     future_w[m]=0;
		 q.push(m);
	 }
	 future_h[w]=h;
	 future_w[h]=w;
}
int main()
{
	int t;
	scanf("%d",&t);
	while(t--)
	{
		int n;
		int i,j;
		scanf("%d",&n);
		int r1=0,r2=0;
		memset(numh,0,sizeof(numh));
		memset(numw,0,sizeof(numw));
		while(1)
		{
		   char k;
		   scanf("%c",&k);
		   if(k>=‘a‘&&k<=‘z‘)
		   {
			   numh[k-‘a‘]=++r1;
		   }
		   else if(k>=‘A‘&&k<=‘Z‘)
		   {
			   numw[k-‘A‘]=++r2;
			   numw1[r2]=k;
		   }
		   if(r1==n&&r2==n)
		   	    break;
		}
		getchar();
		for(i=1;i<=n;i++)
		{
			char p;
			scanf("%c:",&p);
			int c=numh[p-‘a‘];
			scanf("%s",ss);
			getchar();
			int len=strlen(ss);
			for(j=0;j<len;j++)
			{
			    int c1=numw[ss[j]-‘A‘];
				pref[c][j+1]=c1;
				//printf("%d-%d\n",j+1,c1);
			}
			future_w[c]=0;
			next[c]=1;
			q.push(c);
		}
		for(i=1;i<=n;i++)
		{
			char p;
			scanf("%c:",&p);
			int c=numw[p-‘A‘];
			scanf("%s",ss);
			int len=strlen(ss);
			for(int j=0;j<len;j++)
			{
			    int c1=numh[ss[j]-‘a‘];
				prem[c][c1]=j+1;
			}
			future_h[i]=0;
			getchar();
		}
	while(!q.empty())
	{
	    int man=q.front();q.pop();
        int woman=pref[man][next[man]++];
		if(future_h[woman]==0)
			maried(man,woman);
		else if(prem[woman][man]<prem[woman][future_h[woman]])
			maried(man,woman);
		else
			q.push(man);
	}
	for(i=‘a‘;i<=‘z‘;i++)
    {
        if(numh[i-‘a‘])
        {
            printf("%c %c\n",i,numw1[future_w[numh[i-‘a‘]]]);
        }
    }
    if(t) printf("\n");
	}
    return 0;
}