题目: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; /* 存在可能名