题目大意:
没什么好说的,稳定婚姻问题。
解题思路:
首先将所有的男的压入一次加入队列中,对于每一个男的
<script type="math/tex" id="MathJax-Element-104">~</script>
AC代码:
#include <cstdio>
#include <cstring>
#include <cstdlib>
#include <cmath>
#include <algorithm>
#include <iostream>
#include <map>
#include <string>
#include <queue>
using namespace std;
map <string,int> man;
map <string,int> woman;
string wname[810];
string mname[810];
int N;
int num=0;
int Gm[810][810]={{0}};
int Gw[810][810]={{0}};
int Linkm[810]={0};
int Linkw[810]={0};
int main()
{
ios::sync_with_stdio(0);
cin>>N;
for(int i=1;i<=N;i++)
{
cin>>mname[i];
man[mname[i]]=i;
for(int j=1;j<=N;j++)
{
string ch;
cin>>ch;
if(!woman[ch])
{
woman[ch]=++num;
wname[num]=ch;
}
Gm[i][j]=woman[ch];
}
}
for(int i=1;i<=N;i++)
{
string ch;
cin>>ch;
int gg=woman[ch];
wname[gg]=ch;
for(int j=1;j<=N;j++)
{
cin>>ch;
Gw[gg][man[ch]]=j;
}
}
queue <int> Que;
for(int i=1;i<=N;i++)
Que.push(i);
for(;!Que.empty();)
{
int cnt=Que.front();
Que.pop();
int i;
for(i=1;i<=N;i++)
{
int gg=Gm[cnt][i];
if(Linkw[gg]==0)
{
Linkw[gg]=cnt;
Linkm[cnt]=gg;
break;
}
else if(Gw[gg][cnt]<Gw[gg][Linkw[gg]])
{
Que.push(Linkw[gg]);
Linkw[gg]=cnt;
Linkm[cnt]=gg;
break;
}
}
if(i>N) Que.push(cnt);
}
cout<<"YES"<<endl;
for(int i=1;i<=N;i++)
cout<<mname[i]<<' '<<wname[Linkm[i]]<<endl;
return 0;
}