题目大意

给定两个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】钙铁锌硒维生素相关推荐

  1. Bzoj3168 [Heoi2013]钙铁锌硒维生素

    Time Limit: 20 Sec  Memory Limit: 256 MB Submit: 466  Solved: 151 Description 银河队选手名单出来了!小林,作为特聘的营养师 ...

  2. BZOJ3168: [Heoi2013]钙铁锌硒维生素

    传送门 题意 给定一个满秩的矩阵 AAA ,另一个矩阵 BBB 对于 AAA 的每个行向量 AiA_iAi​ 找到一个匹配 BBB 的行向量 BpiB_{p_i}Bpi​​ 使得 AiA_iAi​ 替 ...

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

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

  4. bzoj3168 [Heoi2013]钙铁锌硒维生素(矩阵求逆+匈牙利)

    如果把ai替换成bj,这n个向量还是线性无关即可以. 我们求一个C∗A=B,=>C=B∗A−1C∗A=B,=>C=B∗A−1C*A=B,=>C=B*A^{-1} 矩阵求逆可以高斯消元 ...

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

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

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

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

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

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

  8. BZOJ 3168 Luogu P4100 [HEOI2013]钙铁锌硒维生素 (矩阵求逆、二分图匹配)

    线性代数+图论好题. 题目链接: (bzoj) https://www.lydsy.com/JudgeOnline/problem.php?id=3168 (luogu) https://www.lu ...

  9. [HEOI2013] 钙铁锌硒维生素

    Description 给定2N2N个行向量A1,-,AN,B1,-,BNA_1,\dots,A_N,B_1,\dots,B_N,需要设计一种替换方案,AiA_i被BjB_j替换(i∈[1,N],j∈ ...

  10. 【BZOJ】3168: [Heoi2013]钙铁锌硒维生素

    题解 Ca Fe Zn Se 显然我们既然初始矩阵就能通过线性变换变成单位矩阵,则该矩阵一定有逆 没有逆输出NIE 而且因为这些向量两两正交,则表示一个向量的时候表示方法唯一 那么我们求一个逆可以求出 ...

最新文章

  1. 资源 | 机器学习、NLP、Python和Math最好的150余个教程(建议收藏)
  2. Combiner合并案例
  3. Logstash为什么那么慢?—— json序列化
  4. python绘制条形图-python3使用matplotlib绘制条形图
  5. 限定虚拟机可用的CPU利用率
  6. MySQL分区:range(范围)list(in)columns(多字段)hash(散列)key(非数值型的hash)复合(hash key)
  7. 从零开始学_JavaScript_系列(21)——dojo(8)(手把手教你封装一个widget)
  8. Windows下运行Redis-网盘链接-简单粗暴-亲测有用
  9. Python数据结构与算法(4.1)——递归
  10. 海康大华网络录像机摄像机设备几种NTP校时方法
  11. 为什么密度泛函理论 (DFT) 会低估带隙?
  12. 软考之系统架构师考试经验分享
  13. mac mini u盘安装系统_系统安装丨如何制作U盘启动盘?
  14. 驾驶员监控系统 DMS
  15. 面试官:说一下公平锁和非公平锁的区别?
  16. python+html实现前后端数据交互界面显示
  17. 淘宝个人卖家如何进行免登声明
  18. android8关机界面,修改android 的关机界面
  19. 第十章分治算法(大数相乘)
  20. 多吃巧克力多笑脑子会更聪明

热门文章

  1. uva 572 Oil Deposits
  2. Lenovo/联想乐Phone S680 root教程_方法
  3. 一个电脑白痴和一个黑客的超爆笑的对话
  4. 板内板间通信协议及接口(四)SPI
  5. 苹果5越狱教程_iOS 13.3.1 checkra1n 手机越狱?不用电脑也行
  6. 游戏对战平台搭建要选什么服务器
  7. 运动会加油稿计算机学院150字,运动会加油稿150字
  8. BUUCTF misc 专题(22)隐藏的钥匙
  9. kjb文件 解析_Python 之父再发文:构建一个 PEG 解析器
  10. 比亚乔-截至2020年5月,全球两轮车销量同比下降21%