题意:有男孩n个,女孩n个,没人有自己的名字,告诉你在每一个人心中所有异性的排名。问你如果搭配他们,为最稳定合理的搭配。
想法:简单的稳定婚姻问题,如果不理解这个是什么,请看点击打开链接。
#include<iostream>
#include<cstring>
#include<cstdio>
#include<queue>
#include<map>
#include<algorithm>
using namespace std;
const int N=30;
int n;
map<char,int>Mp1,Mp2;
char boy[N],girl[N];
int B_g[N][N],G_b_score[N][N];
bool mark[N][N];
int bg[N],gb[N];
struct node
{
char b,g;
}res[N];
bool cmp(node c,node d)
{
return c.b<d.b;
}
void stable_marry()
{
memset(bg,-1,sizeof(bg));
memset(gb,-1,sizeof(gb));
memset(mark,false,sizeof(mark));
queue<int>q;
while(!q.empty()) q.pop();
for(int i=1;i<=n;i++)
q.push(i);
int head,nxt;
while(!q.empty())
{
head=q.front();
q.pop();
for(int i=1;i<=n;i++)
{
nxt=B_g[head][i];
if(mark[head][nxt]) continue;
mark[head][nxt]=1;
if(gb[nxt]==-1)
{
gb[nxt]=head;
bg[head]=nxt;
break;
}
else if(G_b_score[nxt][gb[nxt]]<G_b_score[nxt][head])
{
q.push(gb[nxt]);
gb[nxt]=head;
bg[head]=nxt;
break;
}
}
}
return;
}
int main()
{
int t,ca=1;
scanf("%d",&t);
while(t--)
{
if(ca!=1) printf("\n");
ca++;
scanf("%d",&n);
getchar();
Mp1.clear();Mp2.clear();
for(int i=1;i<=n;i++)
{
char a[2];
scanf("%s",a);
boy[i]=a[0];
Mp1[a[0]]=i;
}
for(int i=1;i<=n;i++)
{
char a[2];
scanf("%s",a);
girl[i]=a[0];
Mp2[a[0]]=i;
}
for(int i=1;i<=n;i++)
{
char a[50];
scanf("%s",a);
int len=strlen(a);
int k=Mp1[a[0]];
for(int j=2;j<len;j++)
{
int kk=Mp2[a[j]];
B_g[k][j-1]=kk;
}
}
for(int i=1;i<=n;i++)
{
char a[50];
scanf("%s",a);
int len=strlen(a);
int k=Mp2[a[0]];
for(int j=2;j<len;j++)
{
int kk=Mp1[a[j]];
G_b_score[k][kk]=n-j+2;
}
}
stable_marry();
for(int i=1;i<=n;i++)
{
res[i].b=boy[i];
res[i].g=girl[bg[i]];
}
sort(res+1,res+n+1,cmp);
for(int i=1;i<=n;i++)
{
printf("%c %c\n",res[i].b,res[i].g);
}
}
return 0;
}