> For the complete documentation index, see [llms.txt](https://windmising.gitbook.io/introduction-to-algorithms/llms.txt). Markdown versions of documentation pages are available by appending `.md` to page URLs; this page is available as [Markdown](https://windmising.gitbook.io/introduction-to-algorithms/acm-jie-ti-bao-gao/2011-12-28-hdoj-1281-qi-pan-you-xi.md).

# 1281 棋盘游戏 二分匹配与增广链

## 题目链接

<http://acm.hdu.edu.cn/showproblem.php?pid=1281>

二分匹配, 增广链

## 题目描述

在一个N\*M大小的棋盘中，有K个空位置，

（1）在这些空位置上最多能放多少的“车”（一行或一列最多一个）。

（2）空位置中，有的位置若不放“车”，就无法保证放尽量多的“车”，这样的格子被称做重要点，求重要点的个数

## 思考过程

这题可以看成行与列的二分匹配问题，因为每行每列至多只能放一个棋子。第i行与j列匹配代表棋盘第ｉ行ｊ列这个位置放棋子。

那么，棋盘上的点就是二分图的边；“车”的个数就是二分图的最大匹配数。

题目的关键是求重要点。

现假设最大匹配数为ans，且已经求出某一种匹配策略。

1 ：枚举所有可以放的点，去掉某一点后（这里的点指棋盘上的点，也就是二分图的边），就得到一个新的二分图了 if (新二分图的最大匹配数 =＝ ans） then 这个点不是重要点 else // 即新的二分图达不到ans这个匹配数，那么这个点就是必须放的，否则达不到ans。 -->重要边 then 计数+1

2 : 但是这样枚举效率太低。实际上，删边只需考虑求出的匹配边（因为删除非匹配边得到的匹配数不变）。这样，只需删除ans条边，复杂度就降低了。

再进一步分析，删除一条边以后，没有必要重新求删边后新的二分图的最大匹配，只需检查删边后的匹配中--->可不可以再找到新的增广链就可以了。这样，时间复杂度就进一步降到了。

3 : 这样的优化是不可取的

在判断是否存在增广路得时候，不能只以删除的匹配边的顶点作起点来找增广路

正确的方法是：以删边后新的二分图的所有未匹配顶点出发做增广，都找不到增广路，匹配不能再增加

## 总结：

复习了一下二分匹配算法

求二分匹配增广路的方法很巧妙

二分匹配算法的模版待整理
