Ladies' Choice
大白书p352
![](https://images.cnblogs.com/OutliningIndicators/ContractedBlock.gif)
1 #include <bits/stdc++.h> 2 using namespace std; 3 const int maxn=1010; 4 int pref[maxn][maxn],order[maxn][maxn],nex[maxn]; 5 int fhusband[maxn],fwife[maxn]; 6 queue<int> q; //未订婚的男士队列 7 8 void engage(int man,int woman) 9 { 10 int m=fhusband[woman]; 11 if(m) //女士现有未婚夫m 12 { 13 fwife[m]=0; //抛弃m 14 q.push(m); 15 } 16 fwife[man]=woman; 17 fhusband[woman]=man; 18 } 19 20 int main() 21 { 22 int t; 23 scanf("%d",&t); 24 while(t--) 25 { 26 int n; 27 scanf("%d",&n); 28 for(int i=1;i<=n;i++) 29 { 30 for(int j=1;j<=n;j++) 31 scanf("%d",&pref[i][j]); //编号为i的男士第j喜欢的人 32 nex[i]=1; //接下来向排名为1的女士求婚 33 fwife[i]=0; //没有未婚妻 34 q.push(i); 35 } 36 for(int i=1;i<=n;i++) 37 { 38 int x; 39 for(int j=1;j<=n;j++) 40 { 41 scanf("%d",&x); 42 order[i][x]=j; //在编号为i的女士心中,编号为x的男士的排名为j 43 } 44 fhusband[i]=0; //没有未婚夫 45 } 46 while(!q.empty()) 47 { 48 int man=q.front(); 49 q.pop(); 50 int woman=pref[man][nex[man]++]; //下一个求婚对象 51 if(!fhusband[woman]) engage(man,woman); //没有求婚对象,直接订婚 52 else if(order[woman][man]<order[woman][fhusband[woman]]) engage(man,woman); //代替女士的现任未婚夫 53 else q.push(man); //下次再来 54 } 55 while(!q.empty()) q.pop(); 56 for(int i=1;i<=n;i++) printf("%d ",fwife[i]); 57 if(t) puts(""); 58 } 59 return 0; 60 }