稳定婚姻问题

Ladies' Choice

 UVALive - 3989

大白书p352

 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\n",fwife[i]);
57         if(t) puts("");
58     }
59     return 0;
60 }
LRJ

 

posted @ 2017-07-24 14:55  yijiull  阅读(123)  评论(0编辑  收藏  举报