现在的位置: 首页 > 综合 > 正文

zoj 1576 Marriage is Stable

2017年10月18日 ⁄ 综合 ⁄ 共 1814字 ⁄ 字号 评论关闭

稳定婚姻问题

对于稳定婚姻问题,必然存在一个解,所以此题不用考虑无解的情况。用Gale-Shapley+map可以直接搞定。

注意:男女名字可能相同。

Gale-Shapley算法详解:

http://wenku.baidu.com/view/2b5a4c7a1711cc7931b7164a.html

 

#include <iostream>
#include <cstdio>
#include <map>
using namespace std;

#define MAX 0x3fffffff
#define MAXN 601
map<string,int>human,human1;
map<int,string>rehuman,rehuman1;

int liman[MAXN][MAXN], liblady[MAXN][MAXN], libladyValue[MAXN][MAXN];
int man[MAXN],lady[MAXN];
int Stack[MAXN*2], top;

int main()
{
    int n, k, r;
    char s1[10000],s2[10000];
    while(~scanf("%d",&n)){
        human.clear();
        human1.clear();
        rehuman.clear();
        rehuman1.clear();
        k = r = 0;
        scanf("%s",s1);
        human[s1] = k;
        rehuman[k++] = s1;
        for(int j = 0; j < n; j++){
                scanf("%s",s2);
                human1[s2] = r;
                rehuman1[r++] = s2;
                liman[human[s1]][j] = human1[s2];
        }
        for(int i = 1; i < n; i++){
            scanf("%s",s1);
            human[s1] = k;
            rehuman[k++] = s1;
            for(int j = 0; j < n; j++){
                scanf("%s",s2);
                liman[human[s1]][j] = human1[s2];
            }
        }
        for(int i = 1; i <= n; i++){
            scanf("%s",s1);
            for(int j = 0; j < n; j++){
                scanf("%s",s2);
                liblady[human1[s1]][j] = human[s2];
            }
        }
        for(int i = 0; i < MAXN; i++){
            lady[i] = MAX;
            man[i] = 0;
        }
        for(int i = 0; i < n ; i++){
            for(int j = n,t = 0; j >= 0; j--,t++){
                libladyValue[i][liblady[i][j]] = t;
            }
        }
        k = 0;top = -1;
        while(k < n){
            Stack[++top] = k++;
        }
        /*for(int i = 0; i < n; i++){
            printf("%d ",Stack[i]);
        }
        putchar('\n');
        putchar('\n');

        for(int i = 0; i < n; i++){
            for(int j = 0; j < n; j++)
            printf("liman[%d][%d] = %d ",i,j,liman[i][j]);
            putchar('\n');
        }
        putchar('\n');
        for(int i = 0; i < n ; i++){
            for(int j = 0; j < n; j++){
                printf("%d ",libladyValue[i][j]);
            }
            putchar('\n');
        }
3
Albert Laura Nancy Marcy
Brad Marcy Nancy Laura
Chuck Laura Marcy Nancy
Laura Chuck Albert Brad
Marcy Albert Chuck Brad
Nancy Brad Albert Chuck
3
A L N M
B M N L
C L M N
L C A B
M A C B
N B A C

        */

        while(top >= 0){
            int t = liman[Stack[top]][man[Stack[top]]];
            if(libladyValue[t][lady[t]] < libladyValue[t][Stack[top]]){
                int v = lady[t];
                man[v]++;
                lady[t] = Stack[top--];
                if(v != MAX){
                    Stack[++top] = v;
                }
            }
            else man[Stack[top]]++;

        }
        for(int i = 0; i < n; i++){
            k = man[i];

            cout<<rehuman[i]<<" "<<rehuman1[liman[i][k]]<<endl;
        }

    }
    return 0;
}

 

抱歉!评论已关闭.