模板:稳定婚姻问题

Posted leonard-

tags:

篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了模板:稳定婚姻问题相关的知识,希望对你有一定的参考价值。

 1 #include <bits/stdc++.h>
 2 using namespace std;
 3 
 4 const int N=234;
 5 
 6 int Rank[N][N];//i,j  第i个人心中,第j排名是谁
 7 int M[N][N];//i,j  j在i心中的排名
 8 int boy[N],girl[N],Next[N];
 9 int n,t;
10 
11 void solve(){
12     memset(boy,0,sizeof(boy));
13     memset(girl,0,sizeof(girl));
14     for(int i=1;i<=n;i++) Next[i]=1;
15     queue <int> Q;
16     for(int i=1;i<=n;i++) Q.push(i);
17     while(!Q.empty()){
18         int u=Q.front();Q.pop();
19         int v=Rank[u][Next[u]++];
20         if(!girl[v]){
21             girl[v]=u;
22             boy[u]=v;
23         }
24         else if(M[v][girl[v]]>M[v][u]){
25             Q.push(girl[v]);
26             girl[v]=u;
27             boy[u]=v;
28         }
29         else Q.push(u);
30     }
31     for(int i=1;i<=n;i++)
32     printf(" (%d %d)",i,boy[i]);
33     printf("\n");
34 }
35 
36 int main(){
37     scanf("%d",&t);
38 
39     for(int k=1;k<=t;k++){
40         scanf("%d",&n);
41         for(int i=1;i<=n;i++)
42         for(int j=1;j<=n;j++){
43             scanf("%d",&Rank[i][j]);
44             M[i][Rank[i][j]]=j;
45         }
46         for(int i=n+1;i<=2*n;i++)
47         for(int j=1;j<=n;j++){
48             scanf("%d",&Rank[i][j]);
49             M[i][Rank[i][j]]=j;
50         }
51         printf("Case %d:",k);
52         solve();
53     }
54 
55     return 0;
56 }

 

以上是关于模板:稳定婚姻问题的主要内容,如果未能解决你的问题,请参考以下文章

BZOJ 2140 稳定婚姻(强联通分量判环)BZOJ修复工程

BZOJ 2140 稳定婚姻(强联通分量判环)BZOJ修复工程

bzoj2140: 稳定婚姻 图论-tarjan

图论-稳定婚姻问题

稳定婚姻匹配问题

稳定婚姻问题(Stable Marriage Problem)