首页 > 其他分享 >zoj 1576 Marriage is Stable

zoj 1576 Marriage is Stable

时间:2023-07-18 19:36:00浏览次数:37  
标签:++ zoj 1576 int Stack Marriage MAXN top s1


稳定婚姻问题

对于稳定婚姻问题,必然存在一个解,所以此题不用考虑无解的情况。用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;
}

 

标签:++,zoj,1576,int,Stack,Marriage,MAXN,top,s1
From: https://blog.51cto.com/u_16192154/6767458

相关文章

  • BZOJ #3784. 树上的路径
    BZOJ#3784.树上的路径题意给一颗树,求所有路径长度中前\(k\)大。题解首先对于前\(k\)大,我们有一个常见的方法,二分。二分第\(k\)大的路径长度,然后使用点分治统计,点分治内部还要二分,所以时间复杂度\(O(nolg^3n)\)。二分显然是行不通了,想一下就会发现外层和内层的二分......
  • BZOJ 3942: [Usaco2015 Feb]Censoring KMP
    3942:[Usaco2015Feb]CensoringTimeLimit: 10Sec  MemoryLimit: 128MBSubmit: 476  Solved: 260[Submit][Status][Discuss]DescriptionFarmerJohnhaspurchasedasubscriptiontoGoodHooveskeepingmagazineforhiscows,sotheyhaveplentyofmateria......
  • BZOJ 4247: 挂饰 背包dp
    4247:挂饰TimeLimit: 10Sec  MemoryLimit: 256MBSubmit: 999  Solved: 387[Submit][Status][Discuss]DescriptionJOI君有N个装在手机上的挂饰,编号为1...N。JOI君可以将其中的一些装在手机上。JOI君的挂饰有一些与众不同——其中的一些挂饰附有可以挂其他挂件......
  • BZOJ 3223: Tyvj 1729 文艺平衡树 splay
    3223:Tyvj1729文艺平衡树TimeLimit: 10Sec  MemoryLimit: 128MBSubmit: 4614  Solved: 2699[Submit][Status][Discuss]Description您需要写一种数据结构(可参考题目标题),来维护一个有序数列,其中需要提供以下操作:翻转一个区间,例如原有序序列......
  • BZOJ 3073: [Pa2011]Journeys 线段树优化最短路
    3073:[Pa2011]JourneysTimeLimit: 20Sec  MemoryLimit: 512MBSubmit: 243  Solved: 80[Submit][Status][Discuss]DescriptionSeter建造了一个很大的星球,他准备建造N个国家和无数双向道路。N个国家很快建造好了,用1..N编号,但是他发现道路实在太多了,他要一条条......
  • BZOJ 2730: [HNOI2012]矿场搭建 tarjan割点
    2730:[HNOI2012]矿场搭建TimeLimit: 10Sec  MemoryLimit: 128MBSubmit: 2010  Solved: 935[Submit][Status][Discuss]Description煤矿工地可以看成是由隧道连接挖煤点组成的无向图。为安全起见,希望在工地发生事故时所有挖煤点的工人都能有一条出路逃到救援出口......
  • BZOJ 2140: 稳定婚姻 tarjan
    2140:稳定婚姻TimeLimit: 2Sec  MemoryLimit: 259MBSubmit: 764  Solved: 355[Submit][Status][Discuss]Description我国的离婚率连续7年上升,今年的头两季,平均每天有近5000对夫妇离婚,大城市的离婚率上升最快,有研究婚姻问题的专家认为,是与简化离婚手续有关。25......
  • BZOJ 3402: [Usaco2009 Open]Hide and Seek 捉迷藏 最短路
    3402:[Usaco2009Open]HideandSeek捉迷藏TimeLimit: 3Sec  MemoryLimit: 128MBSubmit: 213  Solved: 167[Submit][Status][Discuss]Description    贝茜在和约翰玩一个“捉迷藏”的游戏.    她正要找出所有适合她躲藏的安全牛棚.一共有N(2≤N≤20000......
  • BZOJ 1415: [Noi2005]聪聪和可可 期望dp
    1415:[Noi2005]聪聪和可可TimeLimit: 10Sec  MemoryLimit: 162MBSubmit: 1682  Solved: 991[Submit][Status][Discuss]DescriptionInput数据的第1行为两个整数N和E,以空格分隔,分别表示森林中的景点数和连接相邻景点的路的条数。第2行包含两个整数C和M,以空格分......
  • BZOJ 2427: [HAOI2010]软件安装 树形背包
    2427:[HAOI2010]软件安装TimeLimit: 10Sec  MemoryLimit: 128MBSubmit: 1275  Solved: 492[Submit][Status][Discuss]Description现在我们的手头有N个软件,对于一个软件i,它要占用Wi的磁盘空间,它的价值为Vi。我们希望从中选择一些软件安装到一台磁盘容量为M计算机......