Time Limit: 1000MS | Memory Limit: 65536K | |
Total Submissions: 1966 | Accepted: 838 |
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 a B b A c C
有n个男士n个女士,每个人都对所有异性有一个评价值,男的对女的表白,如果女的没有对象,就会接纳这个男的,如果女的有对象但是女的对这个对象的好感不如表白这个人的好感,这个女的会抛弃现在的对象和对她表白的那个人在一起,要求出最稳定的婚姻状态。
#include<stdio.h> #include<string.h> #include<iostream> #include<queue> using namespace std; int male[30],female[30]; int m[30][30],fm[30][30]; int vis[30]; int n; char t[60]; queue<int> q; void scanf_name() { char tmp[30]; gets(t); //cout<<t <<endl; for(int i=0; i<n; i++) { gets(tmp); //cout<<tmp <<endl; int poit=tmp[0]-'a'+1; q.push(poit); for(int j=2; j<strlen(tmp); j++) { int k=tmp[j]-'A'+1; m[poit][j-1]=k; } } for(int i=0; i<n; i++) { //cout<<"cin"<<endl; gets(tmp); int poit=tmp[0]-'A'+1; for(int j=2; j<strlen(tmp); j++) { int k=tmp[j]-'a'+1; fm[poit][k]=j-1; } } } void GaleShapley() { while(!q.empty()) { int poit=q.front(); //第poit位男士 q.pop(); //if(male[poit]!=-1) //continue; if(vis[poit]>n) continue; int i=++vis[poit]; //第poit位男士最喜欢的第i位女士 //vis[poit]++; int fem=m[poit][i]; //第poit位男士最喜欢的第i为女士是第fem位 if(female[fem]==-1) //如果第fem位女士没有喜欢的人 { female[fem]=poit; male[poit]=fem; continue; } else { int temp=female[fem]; if(fm[fem][temp]>fm[fem][poit]) //如果第fem位女士对当前喜欢的人的喜欢不如对第poit位男士的喜欢 { female[fem]=poit; male[poit]=fem; male[temp]=-1; q.push(temp); continue; } else { q.push(poit); continue; } } } } int main() { int s; scanf("%d",&s); while(s--) { memset(vis,0,sizeof(vis)); memset(male,-1,sizeof(male)); memset(female,-1,sizeof(female)); while(!q.empty()) q.pop(); scanf("%d",&n); getchar(); scanf_name(); GaleShapley(); int i=1; while(i<=n) { if(male[i]!=-1) printf("%c %c\n",i+'a'-1,male[i]+'A'-1); i++; } if(s) printf("\n"); } return 0; }