UVA 1175 - Ladies' Choice

1175 - Ladies' Choice

链接

  稳定婚姻问题。

代码:

 1 #include<bits/stdc++.h>
 2 using namespace std;
 3 typedef long long LL;
 4 
 5 inline int read() {
 6     int x=0,f=1;char ch=getchar();for(;!isdigit(ch);ch=getchar())if(ch=='-')f=-1;
 7     for (;isdigit(ch);ch=getchar())x=x*10+ch-'0';return x*f;
 8 }
 9 
10 const int N = 1010;
11 
12 int pref[N][N],order[N][N],Boys[N],Girls[N],cur[N];
13 queue<int>q; // 求婚队列 
14 
15 void Link(int u,int v) {
16     int t = Girls[v];
17     if (t) {
18         Boys[t] = 0;
19         q.push(t);
20     }
21     Boys[u] = v;
22     Girls[v] = u;
23 }
24 
25 void solve() {
26     int n = read();    
27     for (int i=1; i<=n; ++i) {
28         for (int j=1; j<=n; ++j) 
29             pref[i][j] = read(); // 男孩心中第j个喜欢的女孩 
30         cur[i] = 1; // 求婚对象 
31         Boys[i] = 0; // 男孩的 
32         q.push(i);
33     }
34     for (int i=1; i<=n; ++i) {
35         for (int j=1; j<=n; ++j) {
36             int t = read();
37             order[i][t] = j; // 男孩在女孩中的排名 
38         }
39         Girls[i] = 0; // 女孩的 
40     }
41     while (!q.empty()) {
42         int u = q.front();q.pop();
43         int v = pref[u][cur[u]++];
44         if (!Girls[v]) Link(u,v); 
45         else if (order[v][u] < order[v][Girls[v]]) Link(u,v);
46         else q.push(u);
47     }
48     while (!q.empty()) q.pop(); 
49     for (int i=1; i<=n; ++i) 
50         printf("%d\n",Boys[i]);
51 }
52 int main() {
53     int Case = read();
54     while (Case--) {
55         solve();
56         if(Case) puts("");
57     }
58     return 0;
59 }

猜你喜欢

转载自www.cnblogs.com/mjtcn/p/9276494.html