【BZOJ3168】[Heoi2013]钙铁锌硒维生素 高斯消元求矩阵的逆+匈牙利算法
【BZOJ3168】[Heoi2013]钙铁锌硒维生素
Description
Input
Output
Sample Input
1 0 0
0 1 0
0 0 1
2 3 0
0 7 8
0 0 9
Sample Output
1
2
3
题解:要不是有大爷的题解我还真就不一定能看懂题意。。。
题目大意:给定一个n∗n的满秩矩阵A和一个n∗n的矩阵B,求一个字典序最小的1...n的排列a满足将任意一个Ai换成Bai后矩阵A仍然满秩。
是不是清晰多了?求这样的排列实际上是将A乘上一个矩阵C使得CA=B,C=BA-1。
求出来C后,我们改变思路,将用边i->j表示B中j号机器人能替换A中i号机器人,然后就得到了一个二分图,而CT正好是二分图的邻接矩阵,我们想求二分图的字典序最小的完美匹配。
一开始以为大爷做麻烦了,直接从后往前做一遍匈牙利算法就行,直到我看了Discuss。。。好吧还是要做两边,第一遍正常跑,第二遍贪心的选编号小的,并且要求后面的点不能影响前面的点。
这里依旧是做一下大爷博客的注释:
1.为什么是CA=B而不是AC=B???(我一开始也死活搞不懂)
因为每个机器人对应一个行向量,而我们想让A中的行向量对应B中另外一个行向量,这显然直接矩乘是不行的,但如果我们将A,B分别转置,就可以做到A中一个列向量对应B中另外一个列向量,然后就是ATC=BT(这里的C指的就是二分图的邻接矩阵),等价于CTA=B
2.不影响前面的交错环是什么鬼?(或者你认为我说的也不是那么清楚?)
直接说方法吧:在第二遍DFS的时候记录一下当前是从那个点开始去寻找增广路的,也就意味着编号比这个点小的点我们都不能影响。所以我们看一下B中的机器人所对应的A中的机器人的编号,如果编号<起始点,就不能更改;如果编号=起始点,而我们已经向让起始点和其它点匹配了,这个点就已经被闲置出来了,就可以更改;如果编号>起始点,那么我们继续寻找增广路就行了。
#include <cstdio>
#include <cstring>
#include <iostream>
#include <cmath>
#define mod 999911657
using namespace std;
const double eps=1e-6;
typedef long long ll;
int n,ans;
ll A[310][610],B[310][310],C[310][310];
int vis[310],from[310],to[310];
ll pm(ll x,ll y)
{ll z=1;while(y){if(y&1) z=z*x%mod;x=x*x%mod,y>>=1;}return z;
}
int rd()
{int ret=0; char gc=getchar();while(gc<'0'||gc>'9') gc=getchar();while(gc>='0'&&gc<='9') ret=ret*10+gc-'0',gc=getchar();return ret;
}
int dfs1(int x)
{for(int i=1;i<=n;i++){if(C[i][x]&&!vis[i]){vis[i]=1;if(!from[i]||dfs1(from[i])){to[x]=i,from[i]=x;return 1;}}}return 0;
}
int dfs2(int x,int y)
{for(int i=1;i<=n;i++){if(C[i][x]&&!vis[i]){vis[i]=1;if(from[i]==y||(from[i]>y&&dfs2(from[i],y))){from[i]=x,to[x]=i;return 1;}}}return 0;
}
int main()
{n=rd();int i,j,k;for(i=1;i<=n;i++) for(j=1;j<=n;j++) A[i][j]=rd(),A[i][j+n]=(i==j);for(i=1;i<=n;i++) for(j=1;j<=n;j++) B[i][j]=rd();ll t;for(i=1;i<=n;i++){for(j=i;j<=n;j++) if(A[j][i]){for(k=1;k<=2*n;k++) swap(A[i][k],A[j][k]);break;}t=pm(A[i][i],mod-2);for(k=i;k<=2*n;k++) A[i][k]=A[i][k]*t%mod;for(j=1;j<=n;j++) if(i!=j){t=A[j][i];for(k=1;k<=2*n;k++) A[j][k]=(A[j][k]-t*A[i][k]%mod+mod)%mod;}}for(i=1;i<=n;i++) for(j=1;j<=n;j++) for(k=1;k<=n;k++) C[i][j]=(C[i][j]+B[i][k]*A[k][j+n])%mod;for(i=1;i<=n;i++){memset(vis,0,sizeof(vis));ans+=dfs1(i);}if(ans<n){printf("NIE");return 0;}printf("TAK\n");for(i=1;i<=n;i++){memset(vis,0,sizeof(vis));dfs2(i,i);}for(i=1;i<=n;i++) printf("%d\n",to[i]);return 0;
}
转载于:https://www.cnblogs.com/CQzhangyu/p/7054570.html
【BZOJ3168】[Heoi2013]钙铁锌硒维生素 高斯消元求矩阵的逆+匈牙利算法相关推荐
- 【bzoj2460】[BeiJing2011]元素 贪心+高斯消元求线性基
题目描述 相传,在远古时期,位于西方大陆的 Magic Land 上,人们已经掌握了用魔法矿石炼制法杖的技术.那时人们就认识到,一个法杖的法力取决于使用的矿石. 一般地,矿石越多则法力越强,但物极必反 ...
- HDU4870_Rating_双号从零单排_高斯消元求期望
原题链接:http://acm.hdu.edu.cn/showproblem.php?pid=4870 原题: Rating Time Limit: 10000/5000 MS (Java/Other ...
- 矩阵与高斯消元【矩阵乘法,高斯消元求线性方程组,求行列式】 全网最详,附例题与姊妹篇 一万三千字详解
(详解)矩阵快速幂详解与常见转移矩阵的构造_秦小咩的博客-CSDN博客_矩阵快速幂转移矩阵 目录 矩阵乘法 矩阵快速幂 伪代码模板 例题一 例题2 例题三 例题四 高斯消元 整形高斯消元 浮点型高斯消 ...
- Bzoj3168 [Heoi2013]钙铁锌硒维生素
Time Limit: 20 Sec Memory Limit: 256 MB Submit: 466 Solved: 151 Description 银河队选手名单出来了!小林,作为特聘的营养师 ...
- 洛谷 - P4783 【模板】矩阵求逆(高斯消元求逆矩阵)
题目链接:点击查看 题目大意:给出一个 n * n 的矩阵,求出其逆矩阵,mod 为 1e9 + 7,若不存在输出 No Solution 题目分析:囤个模板,原理就是,初始时在原矩阵右侧设置一个单位 ...
- BZOJ:4820: [Sdoi2017]硬币游戏BZOJ:1444: [Jsoi2009]有趣的游戏(高斯消元求概率)
1444: [Jsoi2009]有趣的游戏 4820: [Sdoi2017]硬币游戏 这两道题都是关于不断随机生成字符后求出现给定字符串的概率的问题. 第一题数据范围较小,将串建成AC自动机以后,以A ...
- bzoj3168 [Heoi2013]钙铁锌硒维生素(矩阵求逆+匈牙利)
如果把ai替换成bj,这n个向量还是线性无关即可以. 我们求一个C∗A=B,=>C=B∗A−1C∗A=B,=>C=B∗A−1C*A=B,=>C=B*A^{-1} 矩阵求逆可以高斯消元 ...
- 2020 icpc济南 A - Matrix Equation (高斯消元求自由元个数)
链接: A - Matrix Equation 题意: 给一个 A 矩阵 一个 B 矩阵(矩阵元素为 0 或 1),求有多少个 C 矩阵 满足 A X C = B . C (叉乘 和 点乘). 思路: ...
- 【BZOJ2115】[Wc2011] Xor 高斯消元求线性基+DFS
[BZOJ2115][Wc2011] Xor Description Input 第一行包含两个整数N和 M, 表示该无向图中点的数目与边的数目. 接下来M 行描述 M 条边,每行三个整数Si,Ti ...
最新文章
- TVM性能评估分析(一)
- C语言下标要求数组或指针,c语言改错 error C2109: 下标要求数组或指针类型怎么改?...
- 360金融发布Q2财报:净利6.92亿,同比增长114%,大数据与AI加持的科技服务是新亮点?
- 英特尔芯片专利官司败诉,判罚140亿,半个季度白干了...
- 计算机科学与技术第二章ppt,计算机科学与技术-编译原理-第二章重点.ppt
- 成功解决.sh: line 6: syntax error near unexpected token `do
- vuex在vuecli中的简单使用
- mysql 异步 同步 不支持,Mysql 异步/同步/半同步复制
- STM32移植UCGUI3.90笔记
- 学会怎样使用Jsp 内置标签、jstl标签库及自定义标签
- 大地测量学基础(复习)第一部分
- css中border属性设置
- asp.net 使用UrlRewritingNet.UrlRewriter组件URL重写,伪静态详解
- 给body设置背景图片,整个图片完整的充满屏幕
- 一千万的股票能一天卖出吗
- 重新启动oracle 服务,在linux重新启动下如何设置oracle服务自动开启
- 按音量键和按Fn+音量键,笔记本电脑均没反应的解决办法
- Run-Time Check Failure #2 - Stack around the variable was corrupte问题处理
- java 正则表达式的应用:读取文件,获取其中的电话号码
- R语言实战应用精讲50篇(三十五)-R语言实现xgboost回归(附R语言代码)
热门文章
- 【BZOJ1135】【POI2009】Lyz
- 语句摘抄——第22周
- 不足100克按100克C语言,C语言_第3章.ppt
- 我胡汉三又回来了之拼多多笔试复盘
- 白皮书显示,2022年仅有28.4%企业实现社保基数完全合规,有38.1%企业额外购买补充商业保险 | 美通社头条...
- FxFactory 7 for Mac(视觉特效软件包)
- Atiitt 前端技术点清单列表 attilax总结 v2 s11.docx 1. ui与前端系列 类库与api	3 1.1. 概念性技术	4 1.2. 运行环境	4 1.3. Ui技术点	4 1
- Excel遇到错误div/0显示为0或者不显示
- 代理自动配置PAC学习
- iPhone手机拍的图片为什么电脑上打不开?秒懂