1. 程式人生 > >模板:穩定婚姻問題

模板:穩定婚姻問題

sizeof body log turn names ont sin case 模板

 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 }

模板:穩定婚姻問題