稳定婚姻问题

#include<stdio.h>  
#include<queue>  
#define M 1007  
using namespace std;  
int pref[M][M],order[M][M],next[M];  
int future_husband[M],future_wife[M];  
queue<int>q;  
//订婚  
void engage(int man,int women)  
{  
    int m=future_husband[women];  
    if(m)//女士有现任丈夫m  
    {  
        future_wife[m]=0;//抛弃他  
        q.push(m);//m加入为订婚的男士队列  
    }  
    future_husband[women]=man;  
    future_wife[man]=women;  
}  
  
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]);//编号为i的男士第j个喜欢的人  
            next[i]=1;//接下来应向排名为1的女士求婚  
            future_wife[i]=0;//没有未婚妻  
            q.push(i);  
        }  
        for(int i=1;i<=n;i++)  
        {  
            int x;  
            for(int j=1;j<=n;j++)  
            {  
                scanf("%d",&x);  
                order[i][x]=j;//在编号为i的女士心目中,编号为x的男士的排名  
            }  
            future_husband[i]=0;//没有未婚夫  
        }  
        while(!q.empty())  
        {  
            int man=q.front();  
            q.pop();  
            int women=pref[man][next[man]++];//下一个求婚对象  
            if(!future_husband[women])//女士没有未婚夫,直接订婚  
                engage(man,women);  
            else if(order[women][man]<order[women][future_husband[women]])//代替女士的现任丈夫  
                engage(man,women);  
            else q.push(man);//直接拒绝,下次再来  
        }  
        while(!q.empty())q.pop();  
        for(int i=1;i<=n;i++)  
            printf("%d\n",future_wife[i]);  
        if(t)  
            printf("\n");  
    }  
    return 0;  
}  

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值