理解匈牙利算法求二分匹配

匈牙利算法是用来求二分图匹配的算法,一般有bfs和dfs两种实现,我一般都是写的dfs的实现,感觉这个比较好理解,实现也比较简单。

二部图:若一个图的顶点可以划分到2个集合,使得每个集合内的顶点之间没有连边,那么这个图就叫做二分图或二部图。

二分匹配问题:求最大边无关集。

交替链:二分图的一条路径,路径的起点和终点来自于不同的集合,且均未被标记(未匹配),且路径中的相邻结点来自不同的集合。

匈牙利算法:存在交替链<=>存在更优匹配

为什么在maxmatch中只需对每个结点一次求一次交替链即可?
答:因为每求一次交替链后,可能增加匹配成功的结点,上一次匹配成功的结点不会变(匹配方式可能变了),而交替链是否存在与匹配成功的结点有关,所以若第一次求从某个点出发不存在交替链,则以后求也不会存在交替链,所以扫描一遍即可。

参考代码:
int x[N],y[N],vis[N];

//求是否存在交替链
int path(int u)
{
  int v;
  for(v=0;v<n;v++)  if(g[u][v] && vis[v]==0)
  {
    vis[v]=1;
    if(y[v]==-1 || path(v))
    {
      x[u]=v;
      y[v]=u;
      return 1;
    }
  }
  return 0;
}
//求最大匹配数
int maxmatch()
{
  int max=0,u;
  memset(x,0xff,sizeof(x));
  memset(y,0xff,sizeof(y));
  for(u=0;u<n;u++)
  {
    memset(vis,0,sizeof(vis));
    max+=path(u);
  }
}

转载于:https://www.cnblogs.com/algorithms/archive/2012/07/07/2580291.html

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值