Hungary 算 法(音译为“匈牙利算法”)是用来解决二分图匹配问题的利器。它的基本思想是通过DFS在二分图中找“交错轨”。但事实上,我认为掌握这个算法甚至根本不 需要理解“交错轨”这个概念,它似乎和“决策树”“隐式图”类似,只是为了理解算法的本质而抽象出来的一种东西,在代码中不会出现,也不影响对代码的浅层 理解和记忆。(dd)
最主要的过程就是search(int x)
Search(int x) 是用来搜索与左边x相匹配的右边的点。
bool search(int x)
{
int i , t ;
for ( i = 1 ; i <= b ; i++) //枚举右边的点
if (map[x][i] && ! ck[i]) //如果右边的i点与x连通而且未被访问
{
ck[i] = true; //标记
t = match[i]; //match[i]表示i点与左边匹配的点
match[i] = x; //现在让i与x匹配
if (t == -1 || search(t)) return true; //如果i未匹配(t=-1)或者与i匹配的点可以与其他点匹配那么返回true
match[i] = t; //如果i不能与x匹配,那么还原。
}
return false;
}
void Main()
{
int i;
memset(match ,255 , sizeof(match));
for ( i = 1 ; i <= a ; i++)
{
memset(ck , 0 , sizeof (ck)); //标记,所有点并未被访问
if (search(i)) max_match++; //如果找到了与i匹配的点,那么最大匹配+1
}
}