P4100-[HEOI2013]钙铁锌硒维生素【矩阵求逆,最大匹配】

1|0正题

题目链接:https://www.luogu.com.cn/problem/P4100


1|1题目大意

给出n个线性无关的向量Ai,然后给出n个向量Bi,求一个字典序最小的排列p使得将任意的Ai替换为Bpi后依旧线性无关。

1n300


1|2解题思路

首先因为我们有n个向量A线性无关,那么显然这n个向量能表示任意向量,如果对于一个Bpi替换为Ai后依旧线性无关,那么BpiAi是等价的(因为BpiAi都代表了剩下n1个无法表示的部分)。

所以只需考虑每个Bj能否换到Ai即可,构建出矩阵A=[A1,A2...An]B=[B1,B2...Bn],考虑一个置换矩阵使得AR=B,那么就是对于每个B如何用A进行表示。

那么如果Ri,j=0也就是说B可以用Aj以外的其他A表示所以B替换到Aj之后肯定线性有关了,所以不行。

R=BA,求逆得到R,这样我们就知道哪些A可以替换哪些B了,问题就变成了最小字典序匹配。对于这个问题我们可以考虑找一条增广环就好了。

时间复杂度O(n3)


1|3code

#include<cstdio> #include<cstring> #include<algorithm> #include<cmath> using namespace std; const int N=310; const double eps=1e-8; int n,v[N],link[N]; double A[N][N],B[N][N]; bool GetInv(){ for(int i=1;i<=n;i++){ int z=i; for(int j=i+1;j<=n;j++) if(fabs(A[j][i])>fabs(A[z][i]))z=j; swap(A[i],A[z]);swap(B[i],B[z]); double x=A[i][i]; if(fabs(x)<eps)return 0; for(int j=1;j<=n;j++) A[i][j]/=x,B[i][j]/=x; for(int j=1;j<=n;j++){ if(i==j)continue; double rate=-A[j][i]; for(int k=1;k<=n;k++) A[j][k]+=rate*A[i][k], B[j][k]+=rate*B[i][k]; } } for(int i=n;i>=1;i--) for(int j=1;j<i;j++){ double rate=-A[j][i]; for(int k=1;k<=n;k++) A[j][k]+=rate*A[i][k],B[j][k]+=rate*B[i][k]; } return 1; } bool dfs(int x){ for(int i=1;i<=n;i++) if(!v[i]&&fabs(B[x][i])>=eps){ v[i]=1; if(!link[i]||dfs(link[i])){ link[i]=x; return 1; } } return 0; } int calc(int x,int top){ for(int i=1;i<=n;i++) if(!v[i]&&fabs(B[x][i])>=eps){ v[i]=1; if(link[i]==top||(link[i]>top&&calc(link[i],top))){ link[i]=x; return i; } } return 0; } int main() { scanf("%d",&n); for(int i=1;i<=n;i++) for(int j=1;j<=n;j++) scanf("%lf",&A[j][i]); for(int i=1;i<=n;i++) for(int j=1;j<=n;j++) scanf("%lf",&B[j][i]); if(!GetInv())return puts("NIE")&0; for(int i=1;i<=n;i++){ memset(v,0,sizeof(v)); if(!dfs(i))return puts("NIE")&0; } puts("TAK"); for(int i=1;i<=n;i++){ memset(v,0,sizeof(v)); printf("%d\n",calc(i,i)); } return 0; }

__EOF__

本文作者QuantAsk
本文链接https://www.cnblogs.com/QuantAsk/p/15254019.html
关于博主:退役OIer,GD划水选手
版权声明:本博客所有文章除特别声明外,均采用 BY-NC-SA 许可协议。转载请注明出处!
声援博主:如果您觉得文章对您有帮助,可以点击文章右下角推荐一下。您的鼓励是博主的最大动力!
posted @   QuantAsk  阅读(42)  评论(0编辑  收藏  举报
编辑推荐:
· .NET Core 中如何实现缓存的预热?
· 从 HTTP 原因短语缺失研究 HTTP/2 和 HTTP/3 的设计差异
· AI与.NET技术实操系列:向量存储与相似性搜索在 .NET 中的实现
· 基于Microsoft.Extensions.AI核心库实现RAG应用
· Linux系列:如何用heaptrack跟踪.NET程序的非托管内存泄露
阅读排行:
· TypeScript + Deepseek 打造卜卦网站:技术与玄学的结合
· 阿里巴巴 QwQ-32B真的超越了 DeepSeek R-1吗?
· 【译】Visual Studio 中新的强大生产力特性
· 张高兴的大模型开发实战:(一)使用 Selenium 进行网页爬虫
· 【设计模式】告别冗长if-else语句:使用策略模式优化代码结构
点击右上角即可分享
微信分享提示