透彻解析二分图最大匹配匈牙利算法模板

/*===========================================================*\
G为图,M为图中的一个匹配,从X集合到Y集合找一个最大匹配
交互道路:对于G的一个匹配M, G中属于M与不属于M的边交替出现的道路
称为一条交互道路.
可增广道路:设P是关于匹配M的一条交互道路,如果P的两个端点是关于
M的非饱和点,那么称P是一条可增广道路。

\*===========================================================*/
int uN, vN; // uN为集合X的个数, vN为集合Y的个数,要初始化!!!
bool g[MAXN][MAXN]; // g[i][j] 表示xi与yj相连
int xM[MAXN], yM[MAXN]; // 输出量
bool chk[MAXN]; // 辅助量检查某轮y[v]是否被check
bool SearchPath(int u){
int v;
for(v = 0; v < vN; v++)
if(g[u][v] && !chk[v])//取u的临界点集合为Y,并且Y没有被访问过
{
chk[v] = true;
if(yM[v] == -1 || SearchPath(yM[v]))//若Y中有非饱和点(-1),则找到一条增广路径;
//若Y已饱和,则找到在匹配M中的边(x,y),x的集合加到X中,
//延长路径(-1->饱和Y->饱和X->(找非饱和点)),SearchPath(yM[v])找到Y中的一个非饱和点
{
yM[v] = u; xM[u] = v;//进行值更新
return true ;
}
}
return false ;
}
int MaxMatch(){
int u, ret = 0 ;
memset(xM, -1, sizeof (xM));//-1表示为非饱和点
memset(yM, -1, sizeof (yM));//-1表示为非饱和点
for(u = 0; u < uN; u++)
if(xM[u] == -1){// 在集合X中找任一非饱和点进行一次增广路径的查找
memset(chk, false, sizeof (chk));
if(SearchPath(u)) ret++;//如果找到一条增广路径,最大匹配的个数加1
}
return ret;
}



 
  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值