BZOJ3168. 【HEOI2013】钙铁锌硒维生素
题目大意
给定两个n∗nn*n的矩阵A,BA,B,求一个字典序最小的排列aa满足将任意一个AiA_i换成BaiB_{a_i}后,矩阵AA仍然满秩。
Data Constraint
n≤300n\leq300
题解
假如我们知道了AiA_i可以被哪一个BB替换,就可以构出一个二分图,然后匈牙利算法跑出方案即可。
现在的问题是如何构图。
设存在矩阵CC,Ci,j≠0C_{i,j}\neq0表示BiB_i需要有AjA_j来表出。那么CC满足C∗A=BC*A=B,两边同时左乘A−1A^{-1},C=B∗A−1C=B*A^{-1}。
矩阵求逆
如何对矩阵求逆?
考虑构造一个伴随矩阵,初始时伴随矩阵是单位矩阵。对原矩阵进行高斯消元,同时对伴随矩阵做同样的变换。将原矩阵消成单位矩阵后,伴随矩阵就是原矩阵的逆矩阵。
时间复杂度:O(n3)O(n^3)
如何求字典序最小的方案?先跑一遍匈牙利,求出一个初始解,然后跑第二遍匈牙利,贪心地匹配尽可能小的,强制每次只能调整比自己大的匹配。
时间复杂度:O(n3)O(n^3)
SRC
#include<cstdio>
#include<cstdlib>
#include<cstring>
#include<iostream>
#include<algorithm>
#include<cmath>
using namespace std ;#define N 300 + 10
#define M 90000 + 10
const double eps = 1e-6 ;double a[N][N] , inv[N][N] , b[N][N] , c[N][N] ;
int from[M] , flag[M] , f[N][N] ;
int n , ans ;bool GetInv() {for (int i = 1 ; i <= n ; i ++ ) {int p = -1 ;for (int j = 1 ; j <= n ; j ++ )if ( fabs( a[i][j] - 0 ) > eps ) { p = i ; break ; }if ( p < 0 ) continue ;double d = a[i][p] ;for (int j = 1 ; j <= n ; j ++ ) {a[i][j] /= d ;inv[i][j] /= d ;}for (int j = 1 ; j <= n ; j ++ ) {if ( i == j || fabs( a[j][p] - 0 ) <= eps ) continue ;double d = a[j][p] ;for (int k = 1 ; k <= n ; k ++ ) {a[j][k] -= d * a[i][k] ;inv[j][k] -= d * inv[i][k] ;}}}for (int i = 1 ; i <= n ; i ++ ) if ( !a[i][i] ) return 0 ;return 1 ;
}int DFS( int x , int k ) {for (int i = 1 ; i <= n ; i ++ ) {if ( !f[x][i] || flag[i] == k ) continue ;flag[i] = k ;if ( !from[i] || DFS( from[i] , k ) ) {from[i] = x ;return 1 ;}}return 0 ;
}int DFS2( int x , int k ) {for (int i = 1 ; i <= n ; i ++ ) {if ( !f[x][i] || flag[i] == k ) continue ;flag[i] = k ;if ( from[i] == k || ( from[i] > k && DFS2( from[i] , k ) ) ) {from[i] = x ;return 1 ;}}return 0 ;
}int main() {scanf( "%d" , &n ) ;for (int i = 1 ; i <= n ; i ++ ) {for (int j = 1 ; j <= n ; j ++ ) scanf( "%lf" , &a[i][j] ) ;inv[i][i] = 1 ;}if ( !GetInv() ) { printf( "NIE\n" ) ; return 0 ; }for (int i = 1 ; i <= n ; i ++ ) {for (int j = 1 ; j <= n ; j ++ ) {scanf( "%lf" , &b[i][j] ) ;}}for (int i = 1 ; i <= n ; i ++ ) {for (int j = 1 ; j <= n ; j ++ ) {for (int k = 1 ; k <= n ; k ++ ) {c[i][j] += b[i][k] * inv[k][j] ;}}}for (int i = 1 ; i <= n ; i ++ ) {for (int j = 1 ; j <= n ; j ++ ) {if ( fabs( c[j][i] - 0 ) > eps ) f[i][j] = 1 ;}}for (int i = 1 ; i <= n ; i ++ ) ans += DFS( i , i ) ;if ( ans < n ) { printf( "NIE\n" ) ; return 0 ; }memset( flag , 0 , sizeof(flag) ) ;for (int i = 1 ; i <= n ; i ++ )ans = DFS2( i , i ) ;printf( "TAK\n" ) ;for (int i = 1 ; i <= n ; i ++ ) {for (int j = 1 ; j <= n ; j ++ ) {if ( from[j] == i ) { printf( "%d\n" , j ) ; break ; }}}return 0 ;
}
以上.
BZOJ3168. 【HEOI2013】钙铁锌硒维生素相关推荐
- Bzoj3168 [Heoi2013]钙铁锌硒维生素
Time Limit: 20 Sec Memory Limit: 256 MB Submit: 466 Solved: 151 Description 银河队选手名单出来了!小林,作为特聘的营养师 ...
- BZOJ3168: [Heoi2013]钙铁锌硒维生素
传送门 题意 给定一个满秩的矩阵 AAA ,另一个矩阵 BBB 对于 AAA 的每个行向量 AiA_iAi 找到一个匹配 BBB 的行向量 BpiB_{p_i}Bpi 使得 AiA_iAi 替 ...
- BZOJ3168. [HEOI2013]钙铁锌硒维生素(线性代数+二分图匹配)
题目链接 https://www.lydsy.com/JudgeOnline/problem.php?id=3168 题解 首先,我们需要求出对于任意的 \(i, j(1 \leq i, j \leq ...
- bzoj3168 [Heoi2013]钙铁锌硒维生素(矩阵求逆+匈牙利)
如果把ai替换成bj,这n个向量还是线性无关即可以. 我们求一个C∗A=B,=>C=B∗A−1C∗A=B,=>C=B∗A−1C*A=B,=>C=B*A^{-1} 矩阵求逆可以高斯消元 ...
- 【BZOJ3168】[Heoi2013]钙铁锌硒维生素 高斯消元求矩阵的逆+匈牙利算法
[BZOJ3168][Heoi2013]钙铁锌硒维生素 Description 银河队选手名单出来了!小林,作为特聘的营养师,将负责银河队选手参加宇宙比赛的饮食.众所周知,前往宇宙的某个星球,通常要花 ...
- 洛谷 P4100 [HEOI2013]钙铁锌硒维生素 解题报告
P4100 [HEOI2013]钙铁锌硒维生素 题目描述 银河队选手名单出来了!小林,作为特聘的营养师,将负责银河队选手参加 宇宙比赛的饮食. 众所周知,前往宇宙的某个星球,通常要花费好长好长的时间, ...
- BZOJ 3168: [Heoi2013]钙铁锌硒维生素 [线性基 Hungary 矩阵求逆]
3168: [Heoi2013]钙铁锌硒维生素 题意:给一个线性无关组A,再给一个B,要为A中每个向量在B中选一个可以代替的向量,替换后仍然线性无关.判断可行和求字典序最小的解 PoPoQQQ orz ...
- BZOJ 3168 Luogu P4100 [HEOI2013]钙铁锌硒维生素 (矩阵求逆、二分图匹配)
线性代数+图论好题. 题目链接: (bzoj) https://www.lydsy.com/JudgeOnline/problem.php?id=3168 (luogu) https://www.lu ...
- [HEOI2013] 钙铁锌硒维生素
Description 给定2N2N个行向量A1,-,AN,B1,-,BNA_1,\dots,A_N,B_1,\dots,B_N,需要设计一种替换方案,AiA_i被BjB_j替换(i∈[1,N],j∈ ...
- 【BZOJ】3168: [Heoi2013]钙铁锌硒维生素
题解 Ca Fe Zn Se 显然我们既然初始矩阵就能通过线性变换变成单位矩阵,则该矩阵一定有逆 没有逆输出NIE 而且因为这些向量两两正交,则表示一个向量的时候表示方法唯一 那么我们求一个逆可以求出 ...
最新文章
- 资源 | 机器学习、NLP、Python和Math最好的150余个教程(建议收藏)
- Combiner合并案例
- Logstash为什么那么慢?—— json序列化
- python绘制条形图-python3使用matplotlib绘制条形图
- 限定虚拟机可用的CPU利用率
- MySQL分区:range(范围)list(in)columns(多字段)hash(散列)key(非数值型的hash)复合(hash key)
- 从零开始学_JavaScript_系列(21)——dojo(8)(手把手教你封装一个widget)
- Windows下运行Redis-网盘链接-简单粗暴-亲测有用
- Python数据结构与算法(4.1)——递归
- 海康大华网络录像机摄像机设备几种NTP校时方法
- 为什么密度泛函理论 (DFT) 会低估带隙?
- 软考之系统架构师考试经验分享
- mac mini u盘安装系统_系统安装丨如何制作U盘启动盘?
- 驾驶员监控系统 DMS
- 面试官:说一下公平锁和非公平锁的区别?
- python+html实现前后端数据交互界面显示
- 淘宝个人卖家如何进行免登声明
- android8关机界面,修改android 的关机界面
- 第十章分治算法(大数相乘)
- 多吃巧克力多笑脑子会更聪明
热门文章
- uva 572 Oil Deposits
- Lenovo/联想乐Phone S680 root教程_方法
- 一个电脑白痴和一个黑客的超爆笑的对话
- 板内板间通信协议及接口(四)SPI
- 苹果5越狱教程_iOS 13.3.1 checkra1n 手机越狱?不用电脑也行
- 游戏对战平台搭建要选什么服务器
- 运动会加油稿计算机学院150字,运动会加油稿150字
- BUUCTF misc 专题(22)隐藏的钥匙
- kjb文件 解析_Python 之父再发文:构建一个 PEG 解析器
- 比亚乔-截至2020年5月,全球两轮车销量同比下降21%