zoj 1576 Marriage is Stable

本文介绍了一种使用 Gale-Shapley 算法解决稳定婚姻问题的方法,并提供了一个具体的 C++ 实现示例。该算法确保了每一对匹配都是稳定的,即使在男女名字相同的情况下也能正确运行。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

稳定婚姻问题

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


 

内容概要:本文介绍了多种开发者工具及其对开发效率的提升作用。首先,介绍了两款集成开发环境(IDE):IntelliJ IDEA 以其智能代码补全、强大的调试工具和项目管理功能适用于Java开发者;VS Code 则凭借轻量级和多种编程语言的插件支持成为前端开发者的常用工具。其次,提到了基于 GPT-4 的智能代码生成工具 Cursor,它通过对话式编程显著提高了开发效率。接着,阐述了版本控制系统 Git 的重要性,包括记录代码修改、分支管理和协作功能。然后,介绍了 Postman 作为 API 全生命周期管理工具,可创建、测试和文档化 API,缩短前后端联调时间。再者,提到 SonarQube 这款代码质量管理工具,能自动扫描代码并检测潜在的质量问题。还介绍了 Docker 容器化工具,通过定义应用的运行环境和依赖,确保环境一致性。最后,提及了线上诊断工具 Arthas 和性能调优工具 JProfiler,分别用于生产环境排障和性能优化。 适合人群:所有希望提高开发效率的程序员,尤其是有一定开发经验的软件工程师和技术团队。 使用场景及目标:①选择合适的 IDE 提升编码速度和代码质量;②利用 AI 编程助手加快开发进程;③通过 Git 实现高效的版本控制和团队协作;④使用 Postman 管理 API 的全生命周期;⑤借助 SonarQube 提高代码质量;⑥采用 Docker 实现环境一致性;⑦运用 Arthas 和 JProfiler 进行线上诊断和性能调优。 阅读建议:根据个人或团队的需求选择适合的工具,深入理解每种工具的功能特点,并在实际开发中不断实践和优化。
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值