Description

The stable marriage problem consists of matching members of two different sets according to the member’s preferences for the other set’s members. The input for our problem consists of:

  • a set M of n males;
  • a set F of n females;
  • for each male and female we have a list of all the members of the opposite gender in order of preference (from the most preferable to the least).

A marriage is a one-to-one mapping between males and females. A marriage is called stable, if there is no pair (m, f) such that f ∈ F prefers m ∈ M to her current partner and m prefers f over his current partner. The stable marriage A is called male-optimal if there is no other stable marriage B, where any male matches a female he prefers more than the one assigned in A.

Given preferable lists of males and females, you must find the male-optimal stable marriage.

Input

The first line gives you the number of tests. The first line of each test case contains integer n (0 < n < 27). Next line describes n male and n female names. Male name is a lowercase letter, female name is an upper-case letter. Then go n lines, that describe preferable lists for males. Next n lines describe preferable lists for females.

Output

For each test case find and print the pairs of the stable marriage, which is male-optimal. The pairs in each test case must be printed in lexicographical order of their male names as shown in sample output. Output an empty line between test cases.

Sample Input

2
3
a b c A B C
a:BAC
b:BAC
c:ACB
A:acb
B:bac
C:cab
3
a b c A B C
a:ABC
b:ABC
c:BCA
A:bac
B:acb
C:abc

Sample Output

a A
b B
c C
Gale-Shapley算法模板题
 1 #include<iostream>
 2 #include<cstdio>
 3 #include<cstring>
 4 #include<cmath>
 5 #include<algorithm>
 6 #include<queue>
 7 using namespace std;
 8 const int N=30;
 9 queue<int>Q;
10 int n,T,manname[N],womanname[N],manlike[N][N],womanlike[N][N],manchoice[N],womanchoice[N];
11 char str[N+5];
12 int main()
13 {int i,j;
14   cin>>T;
15   while (T--)
16     {
17       while (Q.empty()==0) Q.pop();
18       cin>>n;
19       for (i=0;i<n;i++)
20     {
21       scanf("%s",str);
22       manname[i]=str[0]-'a';
23       Q.push(manname[i]);
24     }
25       sort(manname+1,manname+n);
26       for (i=0;i<n;i++)
27     {
28       scanf("%s",str);
29       womanname[i]=str[0]-'A';
30     }
31       for (i=0;i<n;i++)
32     {
33       scanf("%s",str);
34       for (j=0;j<n;j++)
35         manlike[i][j]=str[j+2]-'A';
36     }
37       for (i=0;i<n;i++)
38     {
39       scanf("%s",str);
40       for (j=0;j<n;j++)
41         womanlike[i][str[j+2]-'a']=n-j;
42       womanlike[i][n]=0;
43     }
44       memset(manchoice,0,sizeof(manchoice));
45       for (i=0;i<n;i++)
46     womanchoice[i]=n;
47       while (!Q.empty())
48     {
49       int man=Q.front();
50       int woman=manlike[man][manchoice[man]];
51       if (womanlike[woman][man]>womanlike[woman][womanchoice[woman]])
52         {
53           Q.pop();
54           if (womanchoice[woman]!=n)
55         {
56           Q.push(womanchoice[woman]);
57           manchoice[womanchoice[woman]]++;
58         }
59           womanchoice[woman]=man;
60         }
61       else manchoice[man]++;
62     }
63       for (i=0;i<n;i++)
64     printf("%c %c\n",(char)(manname[i]+'a'),(char)(manlike[manname[i]][manchoice[i]]+'A'));                    
65     cout<<endl;
66     }
67 }

 

a B
b A
c C

相关文章: