[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列的网格,网格种有重要位置和障碍物.要求用最少的机器人看守所有重要的位置,每个机器人放在一个格子里,面朝上下左右四个方向之一发出激光直到射到障碍物为止,沿途都是看守范围.机器人不会 ...
随机推荐
- zookeeper[2] zookeeper原理(转)
转自:http://cailin.iteye.com/blog/2014486 ZooKeeper是一个分布式的,开放源码的分布式应用程序协调服务,它包含一个简单的原语集,分布式应用程序可以基于它实现 ...
- Android原理揭秘系列之一动态墙纸
Livewallpaper,即动态墙纸,是Android的一大3D特色功能,用户可以在桌面选择加载动态墙纸,让自己的手机桌面背景旋动起来. 相对于静态桌面壁纸,动态墙纸可以展示各种动态变化的背景,而与 ...
- Windows下用Caffe跑自己的数据(遥感影像)
1 前言 Caffe对于像我这样的初学者来说是一款非常容易上手的深度学习框架.关于用Caffe跑自己的数据这样的博客已经非常多,感谢前辈们为我们提供的这么好的学习资源.这里我主要结合我所在的行业,说下 ...
- Log4Qt 使用(一)
一.下载 http://sourceforge.net/projects/log4qt/develop 二.Log4Qt介绍 Log4Qt 是Apache Log4J 的Qt移植版,所以看Log4J的 ...
- ubantu命令安装banner
banner命令可以输出图形字符 在线yum安装 $ sudo apt-get update;sudo apt-get install sysvbanner
- 对html制作新手的一些建议,大牛可以忽略
本篇主要讲前端并给制作html页面的新手一些建议,大牛勿喷大牛可以绕过. 感受:我是搞后端开发的,有时拿到一些静态(Html)页面,看到里面的页面结构命名规则极不规范,就有点不好的 感觉了.当然出现这 ...
- 反射那些事儿——Java动态装载和反射技术
一直以来反射都是只闻其声,却无法将之使用,近日尽心下来学习下,发现了很多精妙之处. Java动态装载和反射技术 一.类的动态装载 1.Java代码编译和执行的整个过程包含了以下三个重要的机制: ● J ...
- SQL Server系统表讲解
1. sysobjects http://www.cnblogs.com/atree/p/SQL-Server-sysobjects.html 2.syscomments http://www.c ...
- 第一个Delphi小程序
第一次应工作需呀,接触这个语言,今晚在自己的电脑搭建好环境,写的第一个超简单的Delphi小程序! var temp:Integer; //求个位数 procedure TForm1.BitBtn1C ...
- 2016/01/10 C++ Primer 小记 —— 命令行编译环境配置
OK!第一篇博文!自贺一下! 今日看了此书的前几页.嗯,说得挺全,基础易懂. 之前学过c++,但没用过命令行编译. 本人用的VS里的编译器,文件名是cl.exe,在VC目录下. 虽然有了编译器,但并不 ...