匈牙利算法

noip本来不考,今天有人问,也就写写.

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

       }      

}
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值