找了下带花树算法的相关资料,推荐下面两个:
1. https://www-m9.ma.tum.de/graph-algorithms/matchings-blossom-algorithm/index_en.html
对利用带花树算法求解最大匹配的动画演示和伪代码解析,个人认为非常有助于理解
2. http://www.csie.ntnu.edu.tw/~u91029/Matching.html#5
该网站不仅包含对带花树算法的详细介绍,也对其他一些匹配算法进行了讲解
关键概念:
(害怕网站2关闭…所以这里通过截图稍稍介绍一下基本概念)
- 交错树(增广路径的概念不再做介绍):如为未匹配点r寻找匹配点,则以r作为树根,由增广路径延伸出来形成交错树
- 奇点与偶点:见图中说明,r为偶点,距r为偶数距离的点为偶点,奇数距离的点为奇点
- cross edge:偶点到偶点的边
- 花和花托
图中讲解比较详细,注意只有偶点到偶点形成的边构成的环才有这样一个性质,才能形成花,缩花之后奇点实际是以一个偶点的形式存在的。
- 缩花
如下基于自身理解,对该网站中包含缩花方式的代码进行了更加详细的注释,虽然有些小细节依然有点模糊,这里放上代码,希望更有助于大家理解。
const int V=50; //图的点数,编号为0到V-1
bool adj[50][50]; //邻接矩阵
int p[50]; //交错树,存储前一个节点
int m[50]; //记录各点所配对的点,值为-1为未匹配点
int d[50];