CODE[VS]1027 姓名与ID

博客详细介绍了如何运用匈牙利算法解决一个编程题目,该题目旨在找到姓名与ID的一一对应关系。博主首先通过匈牙利算法找到一个最长匹配解,然后检查是否存在其他解。若无其他解,说明匹配是唯一的;若有其他解,表示对应关系不确定。在输入过程中,通过递归调整名字与ID的对应表来确保唯一性。
摘要由CSDN通过智能技术生成

题目:http://codevs.cn/problem/1027/
思路:先使用匈牙利算法求解一个最长匹配解。在修改第一次求解的匹配关系,检测是否还存在其他解,如果有则无法确定对应关系,如果没有则表示匹配唯一。输入过程中如果发现一一对应关系,则通过递归来修整名字与ID的对应表。
题解:

/* 1027 姓名与ID */
#include <stdio.h>
#include <string.h>

#define MAXN 21
#define MAXID 25

int name_id[MAXN][MAXN];    /* 名字-ID对应表 */
int find_id[MAXN];          /* 已匹配ID表 */
int n;                      /* 所有人数 */
char id[MAXN][MAXID];       /* 所有ID */
char name[MAXN][MAXID];     /* 所有名字 */
int ni[MAXN];               /* 名字索引 */
int count;                  /* 名字计数 */
int in_room[MAXN];          /* 在房间人数表 */
int done[MAXN];             /* ID已存在唯一值标记 */
int state[MAXN];            /* 搜索状态标记 */
int result[MAXN];           /* 第一次匹配结果存储 */
int result1[MAXN];          /* 可能存在其他匹配结果存储 */
int ans;                    /* 匹配长度值 */

/* 匈牙利算法求解最长匹配 */
int find(int a, int flag[MAXN])
{
    int i;
    for(i = 1; i <= n; i++)
    {
        if(1 == name_id[a][i] && 0 == state[i])
        {
            state[i] = 1;
            if(0 == flag[i] || find(flag[i], flag))
            {
                flag[i] = a;
                return 1;
            }
        }

    }
    return 0;
}

/* 检测编号为i的ID与名字是否存在匹配 */
int check(int i)
{
    int p, tp;      /* 名字索引与匹配名字记录 */
    int c = 0;      /* 存在可能名
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值