【BZOJ3168】[Heoi2013]钙铁锌硒维生素

Description

银河队选手名单出来了!小林,作为特聘的营养师,将负责银河队选手参加宇宙比赛的饮食。众所周知,前往宇宙的某个星球,通常要花费好长好长的时间,人体情况在这之间会发生变化,因此,需要根据每天的情况搭配伙食,来保证营养。小林把人体需要的营养分成了n种,这些营养包括但不限于铁,钙。他准备了2套厨师机器人,一套厨师机器人有n个,每个厨师机器人只会做一道菜,这道菜一斤能提供第i种营养xi微克。想要吃这道菜的时候,只要输入一个数,就能吃到对应数量的这道菜了。为防止摄入过量对身体造成的伤害,每个机器人还有防过量摄入药,只要输入一个数,就能生成一定剂量的药,吃了这些药,就能减少相当于食用对应数目的这道菜提供的营养。小林之所以准备2套厨师机器人,正是因为旅途漫漫,难以预计,也许某一个厨师机器人在途中坏掉,要是影响了银河队选手的身体,就不好了。因此,第2套厨师机器人被用来做第1套的备用。小林需要为每一个第1套厨师机器人选一个第2套厨师机器人作备份,使得当这个机器人坏掉时,用备份顶替,整套厨师机器人仍然能搭配出任何营养需求,而且,每个第2套厨师机器人只能当一个第1套厨师机器人的备份。

Input

第一行包含一个正整数n。
接下来n行,每行n个整数,表示第1套厨师机器人做的菜每一斤提供的每种营养。
再接下来n行,每行n个整数,表示第2套厨师机器人做的菜每一斤提供的每种营养。
1≤n≤300,所有出现的整数均非负,且不超过10,000。

Output

第一行是一个字符串,如果无法完成任务,输出“NIE”,否则输出“TAK”
并跟着n行,第i行表示第i个第1套机器人的备份是哪一个第2套机器人。
为了避免麻烦,如果有多种可能的答案,请给出字典序最小的那一组。

Sample Input

3
1 0 0
0 1 0
0 0 1
2 3 0
0 7 8
0 0 9

Sample Output

TAK
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]钙铁锌硒维生素 高斯消元求矩阵的逆+匈牙利算法相关推荐

  1. 【bzoj2460】[BeiJing2011]元素 贪心+高斯消元求线性基

    题目描述 相传,在远古时期,位于西方大陆的 Magic Land 上,人们已经掌握了用魔法矿石炼制法杖的技术.那时人们就认识到,一个法杖的法力取决于使用的矿石. 一般地,矿石越多则法力越强,但物极必反 ...

  2. HDU4870_Rating_双号从零单排_高斯消元求期望

    原题链接:http://acm.hdu.edu.cn/showproblem.php?pid=4870 原题: Rating Time Limit: 10000/5000 MS (Java/Other ...

  3. 矩阵与高斯消元【矩阵乘法,高斯消元求线性方程组,求行列式】 全网最详,附例题与姊妹篇 一万三千字详解

    (详解)矩阵快速幂详解与常见转移矩阵的构造_秦小咩的博客-CSDN博客_矩阵快速幂转移矩阵 目录 矩阵乘法 矩阵快速幂 伪代码模板 例题一 例题2 例题三 例题四 高斯消元 整形高斯消元 浮点型高斯消 ...

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

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

  5. 洛谷 - P4783 【模板】矩阵求逆(高斯消元求逆矩阵)

    题目链接:点击查看 题目大意:给出一个 n * n 的矩阵,求出其逆矩阵,mod 为 1e9 + 7,若不存在输出 No Solution 题目分析:囤个模板,原理就是,初始时在原矩阵右侧设置一个单位 ...

  6. BZOJ:4820: [Sdoi2017]硬币游戏BZOJ:1444: [Jsoi2009]有趣的游戏(高斯消元求概率)

    1444: [Jsoi2009]有趣的游戏 4820: [Sdoi2017]硬币游戏 这两道题都是关于不断随机生成字符后求出现给定字符串的概率的问题. 第一题数据范围较小,将串建成AC自动机以后,以A ...

  7. bzoj3168 [Heoi2013]钙铁锌硒维生素(矩阵求逆+匈牙利)

    如果把ai替换成bj,这n个向量还是线性无关即可以. 我们求一个C∗A=B,=>C=B∗A−1C∗A=B,=>C=B∗A−1C*A=B,=>C=B*A^{-1} 矩阵求逆可以高斯消元 ...

  8. 2020 icpc济南 A - Matrix Equation (高斯消元求自由元个数)

    链接: A - Matrix Equation 题意: 给一个 A 矩阵 一个 B 矩阵(矩阵元素为 0 或 1),求有多少个 C 矩阵 满足 A X C = B . C (叉乘 和 点乘). 思路: ...

  9. 【BZOJ2115】[Wc2011] Xor 高斯消元求线性基+DFS

    [BZOJ2115][Wc2011] Xor Description Input 第一行包含两个整数N和 M, 表示该无向图中点的数目与边的数目. 接下来M 行描述 M 条边,每行三个整数Si,Ti ...

最新文章

  1. TVM性能评估分析(一)
  2. C语言下标要求数组或指针,c语言改错 error C2109: 下标要求数组或指针类型怎么改?...
  3. 360金融发布Q2财报:净利6.92亿,同比增长114%,大数据与AI加持的科技服务是新亮点?
  4. 英特尔芯片专利官司败诉,判罚140亿,半个季度白干了...
  5. 计算机科学与技术第二章ppt,计算机科学与技术-编译原理-第二章重点.ppt
  6. 成功解决.sh: line 6: syntax error near unexpected token `do
  7. vuex在vuecli中的简单使用
  8. mysql 异步 同步 不支持,Mysql 异步/同步/半同步复制
  9. STM32移植UCGUI3.90笔记
  10. 学会怎样使用Jsp 内置标签、jstl标签库及自定义标签
  11. 大地测量学基础(复习)第一部分
  12. css中border属性设置
  13. asp.net 使用UrlRewritingNet.UrlRewriter组件URL重写,伪静态详解
  14. 给body设置背景图片,整个图片完整的充满屏幕
  15. 一千万的股票能一天卖出吗
  16. 重新启动oracle 服务,在linux重新启动下如何设置oracle服务自动开启
  17. 按音量键和按Fn+音量键,笔记本电脑均没反应的解决办法
  18. Run-Time Check Failure #2 - Stack around the variable was corrupte问题处理
  19. java 正则表达式的应用:读取文件,获取其中的电话号码
  20. R语言实战应用精讲50篇(三十五)-R语言实现xgboost回归(附R语言代码)

热门文章

  1. 【BZOJ1135】【POI2009】Lyz
  2. 语句摘抄——第22周
  3. 不足100克按100克C语言,C语言_第3章.ppt
  4. 我胡汉三又回来了之拼多多笔试复盘
  5. 白皮书显示,2022年仅有28.4%企业实现社保基数完全合规,有38.1%企业额外购买补充商业保险 | 美通社头条...
  6. FxFactory 7 for Mac(视觉特效软件包)
  7. Atiitt 前端技术点清单列表 attilax总结 v2 s11.docx 1. ui与前端系列 类库与api 3 1.1. 概念性技术 4 1.2. 运行环境 4 1.3. Ui技术点 4 1
  8. Excel遇到错误div/0显示为0或者不显示
  9. 代理自动配置PAC学习
  10. iPhone手机拍的图片为什么电脑上打不开?秒懂