这个小小的算法很是难以理解,特别对于入门级的同学来说。不过,也不乏能言会说的人。
找到了一篇很是容易理解的文章,很是受用。通俗易懂
然后再应用Matrix67大神的一句话来概括一下:说穿了,就是你从二分图中找出一条路径来,让路径的起点和终点都是还没有匹配过的点,并且路径经过的连线是一条没被匹配、一条已经匹配过,再下一条又没匹配这样交替地出现。找到这样的路径后,显然路径里没被匹配的连线比已经匹配了的连线多一条,于是修改匹配图,把路径里所有匹配过的连线去掉匹配关系,把没有匹配的连线变成匹配的,这样匹配数就比原来多1个。不断执行上述操作,直到找不到这样的路径为止。
关于匈牙利算法推荐两道题目:NYOJ的月老的难题,以及HDOJ 的过山车。都是裸的匈牙利算法的典型题目。
留下一个小小的模板吧!
寻找增广路径,这是该算法的关键之处。
bool Find_Path(int x)//寻找在匹配中是否还存在增广路径.
{
for(int i=1;i<=n;i++)
{
if(Map[x][i]&&!Vis[i])
{
Vis[i]=true;
if(!Match[i]||Find_Path(Match[i]))
{
Match[i]=x;
return true;
}
}
}
return false;
}
扫描每一个定点,看是否还有增广路径存在。
int Add()//
{
int max=0;
for(int i=1;i<=m;i++)
{
if(Find_Path(i)) max++;
CLR(Vis,0);
}
return max;
}
总体来说,这个算法还是比较好理解的。
二分图的最小边覆盖:就 是在二分图中找最少的边数使得二分图中的每个顶点都和这些边关联。
最小边覆盖=顶点数-最大匹配数。
二分图的最小点覆盖:就是在二分图中找最少的点数使得二分图中的每条边中的至少一个顶点在这些点上。
最小点覆盖=最大匹配数。
二分图的最大独立集:就是在二分图中的一个点集,使得这个点集中任意两个点中没有对应边。
最大独立集=顶点数-最大匹配数。