bzoj3168 [Heoi2013]钙铁锌硒维生素(矩阵求逆+匈牙利)
如果把ai替换成bj,这n个向量还是线性无关即可以。
我们求一个C∗A=B,=>C=B∗A−1C∗A=B,=>C=B∗A−1C*A=B,=>C=B*A^{-1}
矩阵求逆可以高斯消元来做,注意他原本的A矩阵也不一定就线性无关qaq
如果Cij!=0Cij!=0C_{ij}!=0,说明bj可以替换ai。因此CTCTC^T就是这张二分图的邻接矩阵。
然后我们就要求一个字典序最小的完备匹配了。
可以先随便找一个完备匹配,然后从小到大的贪心,看能否在不影响前面已确定的点的情况下找到一条交替路使得自己的标号更小。
复杂度O(n3)O(n3)O(n^3)
#include <bits/stdc++.h>
using namespace std;
#define ll long long
#define inf 0x3f3f3f3f
#define N 310
#define mod 1000000007
inline char gc(){static char buf[1<<16],*S,*T;if(S==T){T=(S=buf)+fread(buf,1,1<<16,stdin);if(T==S) return EOF;}return *S++;
}
inline int read(){int x=0,f=1;char ch=gc();while(ch<'0'||ch>'9'){if(ch=='-')f=-1;ch=gc();}while(ch>='0'&&ch<='9') x=x*10+ch-'0',ch=gc();return x*f;
}
int n,bf[N];
bool mp[N][N],f[N];
inline void inc(int &x,int y){x+=y;x%=mod;}
inline void dec(int &x,int y){x-=y;if(x<0) x+=mod;}
inline int ksm(int x,int k){int res=1;for(;k;k>>=1,x=(ll)x*x%mod) if(k&1) res=(ll)res*x%mod;return res;
}
struct Matrix{int a[N][N];int* operator[](int x){return a[x];}void init(bool t){memset(a,0,sizeof(a));if(t) for(int i=1;i<=n;++i) a[i][i]=1;}friend Matrix operator*(Matrix a,Matrix b){Matrix res;res.init(0);for(int i=1;i<=n;++i)for(int k=1;k<=n;++k)for(int j=1;j<=n;++j)inc(res[i][j],(ll)a[i][k]*b[k][j]%mod);return res;}Matrix inv(){Matrix c;c.init(1);for(int i=1;i<=n;++i){int r=i;while(r<=n&&!a[r][i]) ++r;if(r!=i) for(int j=1;j<=n;++j) swap(a[r][j],a[i][j]),swap(c[r][j],c[i][j]);int t=ksm(a[i][i],mod-2);for(int j=1;j<=n;++j) a[i][j]=(ll)a[i][j]*t%mod,c[i][j]=(ll)c[i][j]*t%mod;for(int j=1;j<=n;++j){if(j==i) continue;t=a[j][i];for(int k=1;k<=n;++k) dec(a[j][k],(ll)a[i][k]*t%mod),dec(c[j][k],(ll)c[i][k]*t%mod);}}return c;}
}a,b;
inline bool find(int x){for(int y=1;y<=n;++y){if(!mp[x][y]||f[y]) continue;f[y]=1;if(!bf[y]||find(bf[y])){bf[y]=x;return 1;}}return 0;
}
inline bool find2(int x,int id){for(int y=1;y<=n;++y){if(!mp[x][y]||f[y]) continue;f[y]=1;if(bf[y]==id||bf[y]>id&&find2(bf[y],id)){bf[y]=x;return 1;}}return 0;
}
int main(){
// freopen("ferrous10.in","r",stdin);n=read();for(int i=1;i<=n;++i)for(int j=1;j<=n;++j) a[i][j]=read();for(int i=1;i<=n;++i)for(int j=1;j<=n;++j) b[i][j]=read();b=b*a.inv();for(int i=1;i<=n;++i)for(int j=1;j<=n;++j) if(b[i][j]) mp[j][i]=1;for(int i=1;i<=n;++i){memset(f,0,sizeof(f));if(find(i)) continue;puts("NIE");return 0;}puts("TAK");for(int i=1;i<=n;++i){memset(f,0,sizeof(f));find2(i,i);}for(int i=1;i<=n;++i)for(int j=1;j<=n;++j)if(bf[j]==i) printf("%d\n",j);return 0;
}
bzoj3168 [Heoi2013]钙铁锌硒维生素(矩阵求逆+匈牙利)相关推荐
- BZOJ3168: [Heoi2013]钙铁锌硒维生素
传送门 题意 给定一个满秩的矩阵 AAA ,另一个矩阵 BBB 对于 AAA 的每个行向量 AiA_iAi 找到一个匹配 BBB 的行向量 BpiB_{p_i}Bpi 使得 AiA_iAi 替 ...
- Bzoj3168 [Heoi2013]钙铁锌硒维生素
Time Limit: 20 Sec Memory Limit: 256 MB Submit: 466 Solved: 151 Description 银河队选手名单出来了!小林,作为特聘的营养师 ...
- BZOJ 3168 Luogu P4100 [HEOI2013]钙铁锌硒维生素 (矩阵求逆、二分图匹配)
线性代数+图论好题. 题目链接: (bzoj) https://www.lydsy.com/JudgeOnline/problem.php?id=3168 (luogu) https://www.lu ...
- BZOJ3168. [HEOI2013]钙铁锌硒维生素(线性代数+二分图匹配)
题目链接 https://www.lydsy.com/JudgeOnline/problem.php?id=3168 题解 首先,我们需要求出对于任意的 \(i, j(1 \leq i, j \leq ...
- 【BZOJ3168】[Heoi2013]钙铁锌硒维生素 高斯消元求矩阵的逆+匈牙利算法
[BZOJ3168][Heoi2013]钙铁锌硒维生素 Description 银河队选手名单出来了!小林,作为特聘的营养师,将负责银河队选手参加宇宙比赛的饮食.众所周知,前往宇宙的某个星球,通常要花 ...
- BZOJ 3168: [Heoi2013]钙铁锌硒维生素 [线性基 Hungary 矩阵求逆]
3168: [Heoi2013]钙铁锌硒维生素 题意:给一个线性无关组A,再给一个B,要为A中每个向量在B中选一个可以代替的向量,替换后仍然线性无关.判断可行和求字典序最小的解 PoPoQQQ orz ...
- 洛谷 P4100 [HEOI2013]钙铁锌硒维生素 解题报告
P4100 [HEOI2013]钙铁锌硒维生素 题目描述 银河队选手名单出来了!小林,作为特聘的营养师,将负责银河队选手参加 宇宙比赛的饮食. 众所周知,前往宇宙的某个星球,通常要花费好长好长的时间, ...
- [矩阵求逆+二分图匹配]BZOJ 3168 [Heoi2013]钙铁锌硒维生素
题目梗概 给出两个\(n*n\)的矩阵\(A,B\),将\(A,B\)中的向量进行匹配,使得\(A\)的任意向量被匹配的向量替换后,\(A\)仍线性无关,求字典序最小解,保证初始时\(A\)线性无关. ...
- bzoj3168 钙铁锌硒维生素 (矩阵求逆+二分图最小字典序匹配)
设第一套为A,第二套为B 先对于每个B[i]判断他能否替代A[j],即B[i]与其他的A线性无关 设$B[i]=\sum\limits_{k}{c[k]*A[k]}$,那么只要看c[j]是否等于零即可 ...
最新文章
- leetcode之Divide Two Integers
- MyBatis多对多关联查询示例——MyBatis学习笔记之十八
- AD域机器如何指定时钟服务器,active-directory – 如何让我的域控制器与正确的外部时间源同步?...
- java中异常+连接重置_是什么导致我的java.nett.ocketException:连接重置?
- MSSQL 2005 分页分析及优化(转)
- 一文带你认识keepalived,再带你通关LVS+Keepalived!
- matlab实训心得体会,MatLab实习心得体会
- C#基础之--线程、任务和同步:一、异步委托
- 【前端初/中级面经】中小型公司面试时都会问些什么,VUE出境最高?
- win8连接wifi成功但受限制_用于 手机热点或WIFI网络的IM143DTU使用手册
- 网络协议基础05--数据链路层
- 基于STM32F03RCT的多路频率占空比可调PWM输出
- 实训三:文件系统命令及vi编辑
- 工作1-2年,月薪3000不可怕,可怕的是能力与之相匹配
- MySQL中cast()函数
- mac修改cmd+ctrl+q锁定屏幕快捷键
- ASP.Net0625金通置业企业网站
- Android 11 允许安装未知来源权限 变动
- idea2021、2022版本打不开的解决方案
- 行业分析| OA系统中的实时通讯