码迷,mamicode.com
首页 > 其他好文 > 详细

Marriage is Stable HDU1522 稳定婚姻问题

时间:2019-02-16 23:09:11      阅读:193      评论:0      收藏:0      [点我收藏+]

标签:temp   循环   ++   include   span   婚姻   必须   else   ace   

几对男女   给出每个人心中的优先级   进行最合理的匹配

要打印名字的话必须有一个名字数组

英文名用map

稳定婚姻问题:

每次循环遍历所有的男的

每个男的对目前未被拒绝的并且优先级最高的进行预匹配  如果1女的没有伴侣2女的对该男的好感度比女的伴侣的好感度更高   满足任意一个则进行匹配

不断循环直到所有男的都有伴侣

#include<cstdio>
#include<string>
#include<map>
#include<iostream>
#include<cstring>
using namespace std;
#define N 20

map<string,int>mp_boy,mp_girl;
int girl[N][N],boy[N][N];//girl数组存放  第i个女对第j个男的好感度   boy数组存放第i个男的第j优先好感度为谁
int match_girl[N],match_boy[N];
string name_boy[N],name_girl[N];
int rank1[N];

int main()
{
    mp_boy.clear();mp_girl.clear();
    int n;
    while(scanf("%d",&n)==1)
    {
        string name,str;
        int cnt=0;
        for(int i=1;i<=n;i++)
        {
            cin>>name;
            mp_boy[name]=i;
            name_boy[i]=name;
            for(int j=1;j<=n;j++)
            {
                cin>>str;
                int t=mp_girl[str];
                if(!t)
                    mp_girl[str]=t=++cnt,name_girl[cnt]=str;
                boy[i][j]=t;
            }
        }
        for(int i=1;i<=n;i++)
        {
            cin>>name;
            for(int j=1;j<=n;j++)
            {
                cin>>str;
                int t=mp_boy[str];
                girl[ mp_girl[name] ][t]=n-j;
            }
        }
        memset(match_boy,0,sizeof match_boy);
        memset(match_girl,0,sizeof match_girl);
        memset(rank1,0,sizeof rank1);

        int flag=1;
        while(flag)
        {
            flag=0;
            for(int i=1;i<=n;i++)
            {
                if(!match_boy[i])
                {
                    int temp=boy[i][ rank1[i]++ ];
                    if(!match_girl[temp])
                        match_boy[i]=temp,match_girl[temp]=i;
                    else if( girl[temp][i]>girl[temp][ match_girl[temp] ]  )
                    {
                        match_boy[ match_girl[temp] ]=0;
                        match_boy[i]=temp;
                        match_girl[temp]=i;
                    }
                    flag=1;
                }
            }
        }
            for(int i=1;i<=n;i++)
             cout<<name_boy[i]<<" "<<name_girl[ match_boy[i] ]<<endl;
    }
}

 

Marriage is Stable HDU1522 稳定婚姻问题

标签:temp   循环   ++   include   span   婚姻   必须   else   ace   

原文地址:https://www.cnblogs.com/bxd123/p/10389724.html

(0)
(0)
   
举报
评论 一句话评论(0
登录后才能评论!
© 2014 mamicode.com 版权所有  联系我们:gaon5@hotmail.com
迷上了代码!