题目大意

给定两个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)。

[HEOI 2013 day2] 钙铁锌硒维生素 (线性代数,二分图匹配)的更多相关文章

  1. bzoj3168 钙铁锌硒维生素 (矩阵求逆+二分图最小字典序匹配)

    设第一套为A,第二套为B 先对于每个B[i]判断他能否替代A[j],即B[i]与其他的A线性无关 设$B[i]=\sum\limits_{k}{c[k]*A[k]}$,那么只要看c[j]是否等于零即可 ...

  2. [HNOI 2013] 消毒 (搜索,二分图匹配)

    题目大意 一个a * b * c(a * b * c <= 5000)大小的长方体中有一些点需要被覆盖,每次可以选择任意大小的长方体,覆盖其中的点,产生的代价为这个长方体长宽高中最小的那个的长度 ...

  3. [HEOI 2013 day2] SAO (树形动态规划)

    题目大意 给一棵N个节点的有向树(N <= 1000),求其拓扑序列个数. 思路 我们将任意一个点作为根,用dp[i][j]表示以节点i为根的子树满足节点i在第j个位置上的拓扑序列的个数.在求节 ...

  4. BZOJ3168. [HEOI2013]钙铁锌硒维生素(线性代数+二分图匹配)

    题目链接 https://www.lydsy.com/JudgeOnline/problem.php?id=3168 题解 首先,我们需要求出对于任意的 \(i, j(1 \leq i, j \leq ...

  5. BZOJ 3168: [Heoi2013]钙铁锌硒维生素 [线性基 Hungary 矩阵求逆]

    3168: [Heoi2013]钙铁锌硒维生素 题意:给一个线性无关组A,再给一个B,要为A中每个向量在B中选一个可以代替的向量,替换后仍然线性无关.判断可行和求字典序最小的解 PoPoQQQ orz ...

  6. 洛谷 P4100 [HEOI2013]钙铁锌硒维生素 解题报告

    P4100 [HEOI2013]钙铁锌硒维生素 题目描述 银河队选手名单出来了!小林,作为特聘的营养师,将负责银河队选手参加 宇宙比赛的饮食. 众所周知,前往宇宙的某个星球,通常要花费好长好长的时间, ...

  7. 【BZOJ3168】[Heoi2013]钙铁锌硒维生素 高斯消元求矩阵的逆+匈牙利算法

    [BZOJ3168][Heoi2013]钙铁锌硒维生素 Description 银河队选手名单出来了!小林,作为特聘的营养师,将负责银河队选手参加宇宙比赛的饮食.众所周知,前往宇宙的某个星球,通常要花 ...

  8. 【BZOJ 2437】 2437: [Noi2011]兔兔与蛋蛋 (博弈+二分图匹配**)

    未经博主同意不得转载 2437: [Noi2011]兔兔与蛋蛋 Time Limit: 10 Sec  Memory Limit: 128 MBSubmit: 693  Solved: 442 Des ...

  9. UVA 12549 - 二分图匹配

    题意:给定一个Y行X列的网格,网格种有重要位置和障碍物.要求用最少的机器人看守所有重要的位置,每个机器人放在一个格子里,面朝上下左右四个方向之一发出激光直到射到障碍物为止,沿途都是看守范围.机器人不会 ...

随机推荐

  1. Shell入门第一课

    Shell是用C语言编写的程序. 几种常见的shell:bash.sh.csh.ksh等 bash是linux的默认标准shell, 完全兼容sh sh 是unix的默认 标准shell ash 是l ...

  2. apue

    #ifndef apue_h #define apue_h #define _POSIX_C_SOURCE 200809L #if defined(SOLARIS) /* Solaris 10 */ ...

  3. 状态模式(State) 笔记

    让一个对象随着内部的状态改变而发生改变. 状态的两种切换方式: 1) 完全交给Context类切换, 2) 给Context初始化状态,其他的切换根据每一个State类进行切换,Context对象不再 ...

  4. psp个人软件过程需求文档

    1.  业务需求 1.1 应用背景 开发软件项目进度计划总是那么不准确,延期经常出现,跟可恨的是甚至无法给出一个相对比较明确的延迟时间.很大 因素在于分配给开发人员的完成时间与开发人员的实际完成时间有 ...

  5. Android设置里面默认存储器选项(default write disk)的实现

    原生的Android设置里面没有默认存储器的选项,可是MTK偏偏加上了这个功能,可能MTK认为这个比較实用吧,所以,他们在原生的基础上面做了改动.加上了这个功能.可是高通平台没有这个功能.相对MTK来 ...

  6. REST深入浅出

    不知你是否意识到,围绕着什么才是实现异构的应用到应用通信的“正确”方式,一场争论正进行的如火如荼:虽然当前主流的方式明显地集中在基于SOAP.WSDL和WS-*规范的Web Services领域,但也 ...

  7. JAVA设置环境变量和在DOS下运行java程序

    在学校实训的这几天,老师带着我们开始深入的复习java.这是第一天的内容哦 对于“JAVA设置环境变量和在DOS下运行java程序”,许多初学者是陌生的,但了解这个却对后期的学习很重要. http:/ ...

  8. OD: Memory Attach Technology - Off by One, Virtual Function in C++ & Heap Spray

    Off by One 根据 Halvar Flake 在“Third Generation Exploitation”中的描述,漏洞利用技术依攻击难度从小到大分为三类: . 基础的栈溢出利用,可以利用 ...

  9. WPF资源字典使用

    资源字典出现的初衷就在于可以实现多个项目之间的共享资源,资源字典只是一个简单的XAML文档,该文档除了存储希望使用的资源之外,不做任何其它的事情. 1.  创建资源字典 创建资源字典的过程比较简单,只 ...

  10. Ueditor使用方法

    1.到百度下载文件,有各种版本.下载.net版本 2.将所需文件导入工程中 分别是:themes文件夹.third-party文件夹.ueditor.all.min.js.ueditor.config ...