[HEOI 2013 day2] 钙铁锌硒维生素 (线性代数,二分图匹配)
题目大意
给定两个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] 钙铁锌硒维生素 (线性代数,二分图匹配)的更多相关文章
- bzoj3168 钙铁锌硒维生素 (矩阵求逆+二分图最小字典序匹配)
设第一套为A,第二套为B 先对于每个B[i]判断他能否替代A[j],即B[i]与其他的A线性无关 设$B[i]=\sum\limits_{k}{c[k]*A[k]}$,那么只要看c[j]是否等于零即可 ...
- [HNOI 2013] 消毒 (搜索,二分图匹配)
题目大意 一个a * b * c(a * b * c <= 5000)大小的长方体中有一些点需要被覆盖,每次可以选择任意大小的长方体,覆盖其中的点,产生的代价为这个长方体长宽高中最小的那个的长度 ...
- [HEOI 2013 day2] SAO (树形动态规划)
题目大意 给一棵N个节点的有向树(N <= 1000),求其拓扑序列个数. 思路 我们将任意一个点作为根,用dp[i][j]表示以节点i为根的子树满足节点i在第j个位置上的拓扑序列的个数.在求节 ...
- BZOJ3168. [HEOI2013]钙铁锌硒维生素(线性代数+二分图匹配)
题目链接 https://www.lydsy.com/JudgeOnline/problem.php?id=3168 题解 首先,我们需要求出对于任意的 \(i, j(1 \leq i, j \leq ...
- BZOJ 3168: [Heoi2013]钙铁锌硒维生素 [线性基 Hungary 矩阵求逆]
3168: [Heoi2013]钙铁锌硒维生素 题意:给一个线性无关组A,再给一个B,要为A中每个向量在B中选一个可以代替的向量,替换后仍然线性无关.判断可行和求字典序最小的解 PoPoQQQ orz ...
- 洛谷 P4100 [HEOI2013]钙铁锌硒维生素 解题报告
P4100 [HEOI2013]钙铁锌硒维生素 题目描述 银河队选手名单出来了!小林,作为特聘的营养师,将负责银河队选手参加 宇宙比赛的饮食. 众所周知,前往宇宙的某个星球,通常要花费好长好长的时间, ...
- 【BZOJ3168】[Heoi2013]钙铁锌硒维生素 高斯消元求矩阵的逆+匈牙利算法
[BZOJ3168][Heoi2013]钙铁锌硒维生素 Description 银河队选手名单出来了!小林,作为特聘的营养师,将负责银河队选手参加宇宙比赛的饮食.众所周知,前往宇宙的某个星球,通常要花 ...
- 【BZOJ 2437】 2437: [Noi2011]兔兔与蛋蛋 (博弈+二分图匹配**)
未经博主同意不得转载 2437: [Noi2011]兔兔与蛋蛋 Time Limit: 10 Sec Memory Limit: 128 MBSubmit: 693 Solved: 442 Des ...
- UVA 12549 - 二分图匹配
题意:给定一个Y行X列的网格,网格种有重要位置和障碍物.要求用最少的机器人看守所有重要的位置,每个机器人放在一个格子里,面朝上下左右四个方向之一发出激光直到射到障碍物为止,沿途都是看守范围.机器人不会 ...
随机推荐
- 【转】MVC5中的区域(Areas)
MVC本身提倡的就是关注点分离.但是当项目本身的业务逻辑足够复杂,如果所有的业务逻辑都写个Controller文件夹下面的时候,你会看到非常庞大的各种命名的Controller,这个时候区域的作用就非 ...
- 命令行修改linux系统IP
修改配置文件/etc/sysconfig/network-scrips/ifcfg-eth0.因为机子启动的时候加载的就是这个文件的配置参数.对这个文件进行修改: [root@localhost ...
- 腾讯2013笔试题—web前端笔试题 (老题练手)
问题描述(web前端开发附加题1): 编写一个javascript的函数把url解析为与页面的javascript.location对象相似的实体对象,如:url :'http://www.qq.co ...
- vmstat
vmstat(virtual memory statitics)命令是最常见的Linux/Unix监控工具,可以展现给定时间间隔的服务器的状态值,包括服务器的CPU使用率,内存使用,虚拟内存交换情况, ...
- 根据id查询数据(向前台返回json格式的数据)
/** *@description 根据主键查询Bean */ @RequestMapping(value="/getBean/{getId}") public void getB ...
- 网页CSS
CSS 样式表,(分三类:内联.内嵌.外部) 1,内联, 直接作于于 元素 例: <p style="font-size:14px;"> 2,内嵌 作用于网页 首先 ...
- C#异步编程的实现方式——ThreadPool线程池
在需要创建的线程很多,且都是比较小的线程的情况下,可以使用线程池(ThreadPool类).ThreadPool是一个静态方法,提供了对一个线程集合的操作,它会在线程数不足时增加线程,空闲线程数过多时 ...
- (转)【已解决】关于SQL2008 “不允许保存更改。您所做的更改要求删除并重新创建以下表。您对无法重新创建的标进行了更改或者启用了‘阻止保存要求重新创建表的更改’” 解决方案
近日在使用sql2008的过程中,要对已经创建完成的表结构进行修改,却一直提示弹出如下提示: “ 不允许保存更改.您所做的更改要求删除并重新创建以下表.您对无法重新创建的标进行了更改或者启用了“阻止保 ...
- 记一次lnmp环境下无法执行php文件
lnmp环境搭建好后却无法正常执行php文件,坑爹啊!~ [错误状况] 页面直接打印出php代码内容: php文件无法执行?: 查看nginx配置文件: server { listen 80; ser ...
- 学习OkHttp wiki--Interceptors
Interceptors 拦截器(Interceptors)是一种强有力的途径,来监控,改写和重试HTTP访问.下面是一个简单的拦截器,对流出的请求和流入的响应记录日志. class LoggingI ...