题目大意

给定两个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. MarkWord - 可发布博客的 Markdown编辑器 代码开源

    因为前一段时间看到 NetAnalyzer 在Windows10系统下UI表现惨不忍睹,所以利用一段时间为了学习一下WPF相关的内容,于是停停写写,用了WPF相关的技术,两个星期做了一个Markdow ...

  2. [Android开发常见问题-14] Unexpected namespace prefix "abc" found for tag SomeThing

    很多开发者朋友可能会自己定义一些控件,以此来扩展现有控件的功能,在扩展空间的时候通常会自己定义一些属性,例如: [html]  view plain copy   <android.alex.v ...

  3. 一步一步教你做ios推送

    最近在研究ios的推送问题,遇到了一些问题,最终整理了一下.放在这里和大家分享 APNS的推送机制 首先我们看一下苹果官方给出的对ios推送机制的解释.如下图 Provider就是我们自己程序的后台服 ...

  4. openflow tutorial 开始openflow的学习(一)

    首先不废话介绍openflow了,自己也还搞不清楚究竟是个什么玩意儿,概括不出什么内容来,先做试验,有个大体的感性了解回来再总结吧. 第一步,搭建环境,这一步就是安装工具,不同的系统环境搭建不一致,我 ...

  5. MySQL数据库的环境及简单操作

    ***********************************************声明*************************************************** ...

  6. Java基础知识强化34:String类之String类的转换功能

    1. String类的转换功能 String[] split(String regex)//将字符串变成字符串数组(字符串切割) byte[] getBytes()//将字符串变成字节数组 char[ ...

  7. ansible 学习与实践

    title: ansible 学习与实践 date: 2016-05-06 16:17:28 tags: --- ansible 学习与实践 一 介绍 ansible是新出现的运维工具是基于Pytho ...

  8. Responsive Table 利用@media

    html <table> <thead> <tr> <th>First Name</th> <th>Last Name</ ...

  9. map的使用方法

    package cn.stat.p8.map.demo; import java.util.Collection; import java.util.HashMap; import java.util ...

  10. Floyed算法 最短路径

    #include<iostream>#include<cstdio>int v,e,n; //v是顶点数,e是条数int v1[101][101],path[101][101] ...