[HEOI 2013 day2] 钙铁锌硒维生素 (线性代数,二分图匹配)

时间:2022-04-07 16:04:20

题目大意

给定两个n阶方阵,方阵B的行i能匹配方阵A的行j当且仅当在第一个方阵中用行向量i替换行向量j后,第一个方阵满秩,显然这是个二分图匹配问题,问是否存在完美匹配,如果存在,还要输出字典序最小的方案。

暴力建图

首先我们考虑建立二分图的问题。我们需要对每对(i, j)判断其是否能连边,也就是说需要判断一个方阵是否满秩。我们可以使用高斯消元来计算矩阵的秩。高斯消元将方阵化成上三角之后,方阵满秩当且仅当其主对角线元素之积非零。一次高斯消元时间复杂度为O(n^3),而需要做n^2次高斯消元,故建图的复杂度为O(n^5)。

优化

暴力建图复杂度过高,我们需要对其进行优化。注意到在暴力算法中我们每次都要对矩阵重新进行高斯消元,而每次执行消元操作的矩阵实际上都仅仅是原矩阵改变后的结果。这样,我们想到必须对矩阵先进行一遍整体上的处理。

我们考虑将两个矩阵分别转置,将矩阵B拼在矩阵A右侧形成一个新的n*2n矩阵C。如果我们仅通过行操作(注意这里是转置后的行,相当于原矩阵的列)对这个矩阵C进行变换,使得左半边(也就是矩阵A的部分)变成一个对角矩阵(也就是除了主对角线上的元素外都是零的方阵,我们记这时的矩阵为C',左边部分为A'),那么在替换其中任意列(也就是原来的行)后,我们都可以在O(n)的时间内求出其秩(任然仅需要考虑对角线上的元素,因为仅存在这一种可能不为零的排列),而题目保证方阵A是满秩的,故A'的对角线元素均非零,所以我们仅需判断替换后的那一列中某一元素是否为零即可,这样就可以在O(1)时间内求出变换后的A的秩。建图的复杂度就成了O(n^2)。

方案问题

似乎这道题已经解决了,然而在AC之前我们还需要考虑一个细节问题。如果仅仅对二分图跑一遍匈牙利算法的话,我们求出的方案无法保证是字典序最小的。那么应该如何求得字典序最小的方案呢?

我们考虑我们已经得到一个任意的方案了。这时我们依次考虑集合1中的每个元素i,断开其在当前方案中的连边,也就是假设它还没有匹配成功,然后再依照字典序考虑集合2中的元素j,如果i要占用j,要么(i, j)在原方案中,要么这会导致集合1中另一个点失配,这个点就会尝试重新匹配,如果匹配成功,这就说明在i匹配j的条件下是存在完美匹配方案的,那么无疑字典序最小的方案中必然包含(i, j),我们就可以大胆地将i、j两个点从图中删去,剩下2 * (n - 1)个点,接下来需要做的便是在这个新的二分图中找到字典序最小的完美匹配方案,而我们已经知道了一个方案,于是这又是一个抽象后和原问题完全相同的子问题了,我们便可以一直迭代下去,直到点集为空为止。

这个调整算法n次尝试重新匹配,每次复杂度为O(n),故整个的复杂度为O(n^2)。