题目梗概

给出两个\(n*n\)的矩阵\(A,B\),将\(A,B\)中的向量进行匹配,使得\(A\)的任意向量被匹配的向量替换后,\(A\)仍线性无关,求字典序最小解,保证初始时\(A\)线性无关.

解题思路

因为\(A\)是\(n\)维空间中的极大线性无关,所以\(A\)是\(n\)维空间的一组基,\(B\)中的任意向量可以用\(A\)的组合表示.

然后有一个结论就是如果\(B\)中的向量\(i\)能替换\(A\)中的向量\(j\),那么用\(A\)表示\(i\)的时候\(j\)的系数不为\(0\).

感觉比较显然...于是设系数矩阵\(C\),有\(C*A=B\),\(C=B*A^{-1}\).

关于矩阵求逆:在把\(A\)消成单位矩阵的时候,对一个单位矩阵进行同样的初等变换.

然后\(C\)的转置显然就是邻接矩阵.

一些细节:字典序最小的求法就是先刷一遍匈牙利然后贪心的修正一遍,因为我们只关心\(C\)中元素是否为零,所以用任意的一个质数在矩阵求逆的时候进行取模就行.

#include<cstdio>
#include<cstring>
#include<algorithm>
#define LL long long
using namespace std;
const int maxn=305,tt=1e9+7,maxm=90005;
int n,f[maxn],ans[maxn];
bool vis[maxn];
int qsm(int w,int b){int num=1;while(b){if (b&1) num=(LL)num*w%tt;w=(LL)w*w%tt;b>>=1;}return num;}
int a[maxn][maxn],b[maxn][maxn],c[maxn][maxn];
void mul(int c[][maxn],int a[][maxn],int b[][maxn]){for (int i=1;i<=n;i++)for (int j=1;j<=n;j++){c[i][j]=0;for (int k=1;k<=n;k++) (c[i][j]+=(LL)a[i][k]*b[k][j]%tt)%=tt;}
}
void get_INV(){for (int i=1;i<=n;i++){if (!a[i][i]) for (int j=i+1;j<=n;j++) if (a[j][i]) swap(a[i],a[j]),swap(c[i],c[j]);int w=qsm(a[i][i],tt-2);for (int j=1;j<=n;j++) a[i][j]=(LL)a[i][j]*w%tt,c[i][j]=(LL)c[i][j]*w%tt;for (int j=1;j<=n;j++) if (a[j][i]&&i!=j){w=a[j][i];for (int k=1;k<=n;k++) a[j][k]=(a[j][k]-(LL)a[i][k]*w%tt+tt)%tt,c[j][k]=(c[j][k]-(LL)c[i][k]*w%tt+tt)%tt;}}
}
bool find(int x){for (int i=1;i<=n;i++) if (a[i][x]&&!vis[i]){vis[i]=1;if (!f[i]||find(f[i])){f[i]=x;return 1;}} return 0;
}
bool work(int x,int fa){for (int i=1;i<=n;i++) if (a[i][x]&&!vis[i]){vis[i]=1;if (f[i]==fa||(f[i]>fa&&work(f[i],fa))){f[i]=x;return 1;}}return 0;
}
int main(){freopen("exam.in","r",stdin);freopen("exam.out","w",stdout);scanf("%d",&n);for (int i=1;i<=n;i++) for (int j=1;j<=n;j++) scanf("%d",&a[i][j]);for (int i=1;i<=n;i++) for (int j=1;j<=n;j++) scanf("%d",&b[i][j]);for (int i=1;i<=n;i++) c[i][i]=1;get_INV();mul(a,b,c);for (int i=1;i<=n;i++){memset(vis,0,sizeof(vis));if (!find(i)){printf("NIE\n");return 0;}}for (int i=1;i<=n;i++){memset(vis,0,sizeof(vis));work(i,i);}for (int i=1;i<=n;i++) ans[f[i]]=i;printf("TAK\n");for (int i=1;i<=n;i++) printf("%d\n",ans[i]);return 0;
} 

转载于:https://www.cnblogs.com/CHNJZ/p/10443662.html

[矩阵求逆+二分图匹配]BZOJ 3168 [Heoi2013]钙铁锌硒维生素相关推荐

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

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

  2. BZOJ 3168 [Heoi2013]钙铁锌硒维生素 ——矩阵乘法 矩阵求逆

    考虑向量ai能否换成向量bj 首先ai都是线性无关的,然后可以a线性表出bj c1*a1+c2*a2+...=bj 然后移项,得 c1/ci*a1+...-1/ci*bj+...=ai 所以当ci不为 ...

  3. BZOJ 3168: [Heoi2013]钙铁锌硒维生素

    对着网上下的数据拍发现过不去,交上去就1A了...... 看discuss才发现标程是错的....... 根据14年的论文,A为n维向量的一组基,B中任意行向量属于Span(A),于是可以得出系数矩阵 ...

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

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

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

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

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

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

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

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

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

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

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

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

最新文章

  1. xfs_repair 实际工作中的问题
  2. python2.7爬虫实例-用案例让你一文搞懂python网络爬虫
  3. Android获取cpu和内存信息、网址的代码
  4. 深入理解移动开发的模板复用机制
  5. MySQL数据库-笔记05【查询练习题*25道(附解析)】
  6. linux c代码出现段错误,Linux下段错误(C语言)
  7. 受困于敏捷开发的数据与架构?肿么办?
  8. TypeScript 2 : 获取当前日期及前后范围日期【Array】
  9. Ubuntu 设置网卡固定IP
  10. [React] 尚硅谷 -- 学习笔记(三)
  11. C语言常见例题源代码
  12. MessageDigest(加密)
  13. MIUI10使用adb工具实现免ROOT冻结系统应用和去广告
  14. C8T6和指南者使用寄存器点灯
  15. EXCEL日期格式不一致设置统一显示格式的方法
  16. 企业邮箱能帮企业带来哪些好处?
  17. RabbitMQ下载与安装
  18. 杨澜对话魏少军赵伟国:中国芯片产业应该如何发展?
  19. 篮球架子 与 足球门
  20. pandas后台导出excel_利用pandas将numpy数组导出生成excel

热门文章

  1. 51nod-1423 最大二“货”(单调栈)
  2. 电脑无规律无响应,鼠标能动但是点击无反应一直在转圈。
  3. 关于Android 4.4(华为)调用系统相机问题
  4. SpringBoot整合elasticsearch (java整合es)
  5. 微软SQL服务器登录,Microsoft SQL Server 【Windows 身份验证】和 【sa】都无法登录的解决方案...
  6. 开发指南专题六:JEECG微云快速开发平台代码生成
  7. ovf导入虚拟服务器,云主机 导入 ovf
  8. 大数据和云计算技术周报(第102期)
  9. Mybatis-Plus如何使用
  10. python实现KNN算法并可视化展示