线性代数+图论好题。

题目链接: (bzoj) https://www.lydsy.com/JudgeOnline/problem.php?id=3168

(luogu) https://www.luogu.org/problemnew/show/P4100

题解: 首先\(A\)矩阵必须满秩。有一个结论是,设矩阵\(C\)满足\(CA=B\), 则\(A\)的第\(i\)行可以被\(B\)的第\(j\)行来替代当且仅当\(C_{j,i}\ne 0\).

若\(B_j\)可以用\(A\)除了\(i\)之外的行向量线性表示,那么\(B_j\)无法替换\(A_i\). 若\(C_{j,i}=0\)代表用\(A\)矩阵的行向量表示\(B_j\)的系数向量中\(A_i\)这一项的系数为\(0\).

那么\(CA=B\)可以推出\(CAA^{-1}=BA^{-1}, C=BA^{-1}\)

数学被各种吊打啊……

然后我们就在\(O(n^3)\)时间内求出了对于每一个\(i,j\), \(A\)中第\(i\)行是否能被\(B\)中第\(j\)行替换

问题转化成了,给一张二分图,保证有完美匹配,求一个完美匹配使得\(A\)中的每个点在\(B\)中的匹配点构成的排列的字典序最小。

这个东西,貌似必须用匈牙利算法。。先跑一边随便求出一个完美匹配,然后从\(1\)号到\(n\)号每个点再匹配尽量小的,如果能找到使当前\(i\)号点更小,且不影响\(i\)号点前面的点的交错路,那么就可以更新答案了。

时间复杂度\(O(n^3)\).

代码

#include<cstdio>
#include<cstdlib>
#include<cstring>
#include<cassert>
#include<iostream>
#define llong long long
using namespace std; inline int read()
{
int x=0; bool f=1; char c=getchar();
for(;!isdigit(c);c=getchar()) if(c=='-') f=0;
for(; isdigit(c);c=getchar()) x=(x<<3)+(x<<1)+(c^'0');
if(f) return x;
return -x;
} const int N = 300;
const int P = 942030731;
llong quickpow(llong x,llong y)
{
llong cur = x,ret = 1ll;
for(int i=0; y; i++)
{
if(y&(1ll<<i)) {y-=(1ll<<i); ret = ret*cur%P;}
cur = cur*cur%P;
}
return ret;
}
llong mulinv(llong x) {return quickpow(x,P-2);}
struct Matrix
{
llong a[N+3][N+3]; int n;
Matrix() {}
Matrix(int _n) {n = _n; for(int i=1; i<=n; i++) for(int j=1; j<=n; j++) a[i][j] = 0ll;}
void read(int _n)
{
n = _n;
for(int i=1; i<=n; i++) for(int j=1; j<=n; j++) scanf("%lld",&a[i][j]);
}
void write()
{
printf("%d\n",n);
for(int i=1; i<=n; i++) {for(int j=1; j<=n; j++) printf("%lld ",a[i][j]); puts("");}
}
Matrix operator *(const Matrix &arg)
{
Matrix ret = Matrix(n);
for(int i=1; i<=n; i++)
{
for(int k=1; k<=n; k++)
{
for(int j=1; j<=n; j++)
{
ret.a[i][j] = (ret.a[i][j]+a[i][k]*arg.a[k][j])%P;
}
}
}
return ret;
}
Matrix inv()
{
Matrix ret = Matrix(n); for(int i=1; i<=n; i++) ret.a[i][i] = 1ll;
for(int i=1; i<=n; i++)
{
if(a[i][i]==0)
{
bool found = false;
for(int j=i+1; j<=n; j++)
{
if(a[j][i])
{
for(int k=1; k<=n; k++) {swap(a[i][k],a[j][k]),swap(ret.a[i][k],ret.a[j][k]);}
found = true; break;
}
}
if(found==false) {ret.a[0][0] = P; return ret;}
}
for(int j=i+1; j<=n; j++)
{
llong coe = (P-a[j][i]*mulinv(a[i][i])%P)%P;
for(int k=1; k<=n; k++)
{
a[j][k] = (a[j][k]+coe*a[i][k])%P;
ret.a[j][k] = (ret.a[j][k]+coe*ret.a[i][k])%P;
}
}
}
for(int i=1; i<=n; i++)
{
llong coe = mulinv(a[i][i]);
for(int j=1; j<=n; j++) {a[i][j] = a[i][j]*coe%P; ret.a[i][j] = ret.a[i][j]*coe%P;}
}
// write();
// ret.write();
for(int i=n; i>=1; i--)
{
for(int j=n; j>=i+1; j--)
{
llong coe = (P-a[i][j]*mulinv(a[j][j])%P)%P;
a[i][j] = 0ll;
for(int k=1; k<=n; k++) ret.a[i][k] = (ret.a[i][k]+coe*ret.a[j][k])%P;
}
}
return ret;
}
} a,b,aux,c;
int g[N+3][N+3];
int vis[N+3];
int match1[N+3],match2[N+3];
int n; bool dfs1(int u)
{
for(int i=1; i<=n; i++)
{
if(g[i][u]==true && vis[i]==false)
{
vis[i] = true;
if(match2[i]==0 || dfs1(match2[i])==true)
{
match2[i] = u; match1[u] = i;
return true;
}
}
}
return false;
} bool dfs2(int u,int u0)
{
for(int i=1; i<=n; i++)
{
if(g[i][u]==true && vis[i]==false)
{
vis[i] = true;
if(match2[i]==u0 || (match2[i]>u0 && dfs2(match2[i],u0)==true))
{
match2[i] = u; match1[u] = i;
return true;
}
}
}
return false;
} int main()
{
scanf("%d",&n);
a.read(n); b.read(n);
aux = a.inv();
if(aux.a[0][0]==P) {printf("NIE"); return 0;}
c = b*aux;
for(int i=1; i<=n; i++)
{
for(int j=1; j<=n; j++) g[i][j] = c.a[i][j]==0 ? 0 : 1;
}
// for(int i=1; i<=n; i++) {for(int j=1; j<=n; j++) printf("%d",g[i][j]); puts("");}
int mf = 0;
for(int i=1; i<=n; i++)
{
for(int j=1; j<=n; j++) vis[j] = false;
mf += dfs1(i);
}
if(mf<n) {printf("NIE"); return 0;}
printf("TAK\n");
for(int i=1; i<=n; i++)
{
for(int j=1; j<=n; j++) vis[j] = false;
dfs2(i,i);
}
for(int i=1; i<=n; i++) printf("%d\n",match1[i]);
return 0;
}

BZOJ 3168 Luogu P4100 [HEOI2013]钙铁锌硒维生素 (矩阵求逆、二分图匹配)的更多相关文章

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

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

  2. BZOJ 3168 Heoi2013 钙铁锌硒维生素 矩阵求逆+匈牙利算法

    题目大意:给定一个n∗n的满秩矩阵A和一个n∗n的矩阵B.求一个字典序最小的1...n的排列a满足将随意一个Ai换成Bai后矩阵A仍然满秩 我们考虑建立一个二分图.假设Ai能换成Bj.就在i−> ...

  3. bzoj3168 钙铁锌硒维生素 (矩阵求逆+二分图最小字典序匹配)

    设第一套为A,第二套为B 先对于每个B[i]判断他能否替代A[j],即B[i]与其他的A线性无关 设$B[i]=\sum\limits_{k}{c[k]*A[k]}$,那么只要看c[j]是否等于零即可 ...

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

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

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

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

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

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

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

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

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

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

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

    设$A^TC=B^T$,这样$C_{ij}$表示$B_j$的线性表出需要$A_i$,那么$B_j$可以替换$A_i$,根据$C=(A^T)^{-1}B^T$求出$C$.要求字典序最小完美匹配,先求任意 ...

随机推荐

  1. 3、APK file does not exist on disk

    参考:https://blog.csdn.net/ouyang_peng/article/details/51243441 亲测可以解决

  2. 洛谷 P2801 教主的魔法 题解

    题面 刚看到这道题的时候用了个树状数组优化前缀和差分的常数优化竟然AC了?(这数据也太水了吧~) 本人做的第一道分块题,调试了好久好久,最后竟然没想到二分上还会出错!(一定要注意)仅此纪念: #inc ...

  3. [CF750G] New Year and Binary Tree Paths

    目录 简单的 组合的 题目链接 简单的 设从节点\(x\)开始不断往左儿子走h-1步,则编号和为\(x\sum_{i=0}^{h-1}2^i=x(2^h-1)\). 若倒数第\(i\)步走向的是右儿子 ...

  4. P1224 [NOI2013]向量内积

    传送门 发现这个内积和矩乘有点像,考虑构造一个 $n$ 行 $m$ 列的矩阵 $A$,每一行都是一个题目给定的 $m$ 维向量 设 $B=AA^T$ ,其中 $A^T$ 为 $A$ 的转置矩阵,那么对 ...

  5. 关于encodeURI() 踩的坑

    情景: 列表页跳转详情页,需要把列表页的数据带到详情页直接展示,思路是在路径后面加?传参,然后再在详情页获取url的参数. 为了以防中文乱码什么的所以先试用encodeURI转码再decodeURI解 ...

  6. MySQL安装+Navicat_Premium(安装+破解)+Navicat_Premium中MySQL的localhost不能正常连接+不能连接Docker启动容器中的MySQL

    MySQL安装 安装MySQL 我这里安装的是 MySQL 8.0 Command Line Client 下载+安装 详情见 https://www.cnblogs.com/taopanfeng/p ...

  7. Centos7安装升级Ruby和集群搭建参考

    安装升级Ruby参考:https://blog.csdn.net/qq_26440803/article/details/82717244 集群搭建参考:https://www.cnblogs.com ...

  8. [转载]排序:长度为n的数组乱序存放着0至n-1. 现在只能进行0与其他数的swap

    长度为n的数组乱序存放着0至n-1. 现在只能进行0与其他数的swap 请设计并实现排序. google笔试小题.题目来源:http://wenku.baidu.com/view/5aa818dda5 ...

  9. PAT Advanced 1050 String Subtraction (20 分)

    Given two strings S​1​​ and S​2​​, S=S​1​​−S​2​​ is defined to be the remaining string after taking ...

  10. tomcat CATALINA_HOME与CATALINA_BASE的区别

    区别 https://blog.csdn.net/cfydaniel/article/details/41351927 Tomcat启动分析(我们为什么要配置CATALINA_HOME环境变量) ht ...