原题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;
}