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 }