稳定婚姻问题

贪心

#include<cstdio>
#include<queue>
using namespace std;

const int maxn=1005; 
int pref[maxn][maxn],order[maxn][maxn],opt[maxn];
int future_husband[maxn],future_wife[maxn];
queue<int> q;

void engage(int man,int woman){   //订婚 
    int m=future_husband[woman];
    if(m){
        future_wife[m]=0;
        q.push(m);
    }
    future_wife[man]=woman;
    future_husband[woman]=man;
}

int main(){
    int T;
    scanf("%d",&T);
    while(T--){
        int n;
        scanf("%d",&n);
        for(int i=1;i<=n;i++){
            for(int j=1;j<=n;j++)
                scanf("%d",&pref[i][j]);
            opt[i]=1;
            future_wife[i]=0;
            q.push(i);
        }
        for(int i=1;i<=n;i++){
            for(int j=1;j<=n;j++){
                int x;
                scanf("%d",&x);
                order[i][x]=j;
            }
            future_husband[i]=0;
        }
        while(!q.empty()){
            int man=q.front();q.pop();
            int woman=pref[man][opt[man]++];
            if(!future_husband[woman]) engage(man,woman);
            else if(order[woman][man]<order[woman][future_husband[woman]]) engage(man,woman);
            else q.push(man);
        }
        for(int i=1;i<=n;i++) printf("%d\n",future_husband[i]);
        if(T) printf("\n");
    }
}

猜你喜欢

转载自www.cnblogs.com/hanasaki/p/11023148.html