Description

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

第一行包含一个正整数n。接下来n行,每行n个整数,表示第
1套厨师机器人做的菜每一斤提供的每种营养。再接下来n行,每行n个整数,表示第2套厨师机器人做的菜每一斤提供的每种营养。 Output

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

对于每一个bib_i求出他能替换哪些向量aja_j,然后就变成了字典序最小的二分图完备匹配问题。
把向量aa组成矩阵AA,然后求xA=bixA=b_i,也就是bi=x1a1+x2a2+⋯+xnanb_i=x_1a_1+x_2a_2+\cdots +x_na_n。如果xjx_j不为零,bib_i可以替换aja_j。把bb拼成矩阵BB,求出C=B∗A−1C=B*A^{-1}就是二分图的邻接矩阵。
在二分图上先求出一个完备匹配,然后从小到大考虑每个位置连的边,选择一条最小的而且不会影响之前的匹配的路径进行更换。
原题数据貌似不保证矩阵A<script type="math/tex" id="MathJax-Element-1193">A</script>可逆,需要判断。

#include<cstdio>
#include<cstring>
#include<algorithm>
using namespace std;
#define LL long long
const int p=100000007;
int n,f[310],vis[310],ans[310],ok=1;
int pow(int base,int x)
{int ret=1;while (x){if (x&1) ret=(LL)ret*base%p;base=(LL)base*base%p;x>>=1;}return ret;
}
struct mat
{int a[310][310];void rd(){for (int i=1;i<=n;i++)for (int j=1;j<=n;j++)scanf("%d",&a[i][j]);}mat operator * (const mat &m) const{mat ret;for (int i=1;i<=n;i++)for (int j=1;j<=n;j++){ret.a[i][j]=0;for (int k=1;k<=n;k++)ret.a[i][j]=(ret.a[i][j]+(LL)a[i][k]*m.a[k][j]%p)%p;}return ret;}mat inv(){mat ret;for (int i=1;i<=n;i++)for (int j=1;j<=n;j++)ret.a[i][j]=(i==j);for (int i=1;i<=n;i++){int x;x=-1;for (int j=i;j<=n;j++)if (a[j][i]){x=j;break;}if (x==-1){ok=0;return ret;}if (x!=i)for (int j=1;j<=n;j++){swap(a[i][j],a[x][j]);swap(ret.a[i][j],ret.a[x][j]);}x=pow(a[i][i],p-2);for (int j=1;j<=n;j++){a[i][j]=(LL)a[i][j]*x%p;ret.a[i][j]=(LL)ret.a[i][j]*x%p;}for (int j=1;j<=n;j++)if (j!=i){x=a[j][i];for (int k=1;k<=n;k++){a[j][k]=(a[j][k]-(LL)a[i][k]*x%p+p)%p;ret.a[j][k]=(ret.a[j][k]-(LL)ret.a[i][k]*x%p+p)%p;}}}return ret;}
}a,b,c;
int dfs1(int u)
{for (int v=1;v<=n;v++)if (c.a[v][u]&&!vis[v]){vis[v]=1;if (!f[v]||dfs1(f[v])){f[v]=u;return 1;}}return 0;
}
int dfs2(int u,int from)
{for (int v=1;v<=n;v++)if (c.a[v][u]&&!vis[v]){vis[v]=1;if (f[v]==from||(f[v]>from&&dfs2(f[v],from))){f[v]=u;return 1;}}return 0;
}
int main()
{int cnt=0;scanf("%d",&n);a.rd();b.rd();c=b*a.inv();if (!ok){printf("NIE\n");return 0;}for (int i=1;i<=n;i++){for (int j=1;j<=n;j++) vis[j]=0;if (dfs1(i)) cnt++;}if (cnt<n) printf("NIE\n");else{printf("TAK\n");for (int i=1;i<=n;i++){for (int j=1;j<=n;j++) vis[j]=0;dfs2(i,i);}for (int i=1;i<=n;i++) ans[f[i]]=i;for (int i=1;i<=n;i++) printf("%d\n",ans[i]);}
}

【HEOI2013】bzoj3168 钙铁锌硒维生素相关推荐

  1. [ 高斯消元 二分图最大匹配 ] [ HEOI2013 ] BZOJ3168 钙铁锌硒维生素

    题解 #include<bits/stdc++.h> using namespace std; const int N=310; const int P=1000000007; int k ...

  2. BZOJ3168. 【HEOI2013】钙铁锌硒维生素

    题目大意 给定两个n∗nn*n的矩阵A,BA,B,求一个字典序最小的排列aa满足将任意一个AiA_i换成BaiB_{a_i}后,矩阵AA仍然满秩. Data Constraint n≤300n\leq ...

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

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

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

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

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

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

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

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

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

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

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

    传送门 题意 给定一个满秩的矩阵 AAA ,另一个矩阵 BBB 对于 AAA 的每个行向量 AiA_iAi​ 找到一个匹配 BBB 的行向量 BpiB_{p_i}Bpi​​ 使得 AiA_iAi​ 替 ...

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

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

最新文章

  1. Matlab与线性代数 -- 矩阵的重组4
  2. 赛迪研究院可以入编吗_对医护来说,拥有编制很重要吗?
  3. NAC网络访问控制,你需要知道的!
  4. MFC两个复选框互斥设置
  5. 由我妈买菜,联想到了数据挖掘
  6. 官网上下载tomcat的linux版本
  7. iHealth基于Docker的DevOps CI/CD实践
  8. (Oracle)关于blob转到目标库报ORA-01461: 仅能绑定要插入 LONG 列的 LONG 值错误解决方案...
  9. 软件测试几个概念 --dev sit uat
  10. QT QTransform与QMatrix 有啥区别?
  11. matplotlib 散点图_python之matplotlib 折线图和散点图
  12. VMware中linux虚拟机无法全屏显示的解决方法(1080P分辨率调节)
  13. Eclipse 配置
  14. Ubuntu 16.04 x64 常用软件
  15. php 生成导出excel,PHP导出生成EXCEL文件
  16. 关于测量物体空间位置的装置
  17. 自定义桌面开始按钮(winxp、7、8、8.1、10)
  18. Learning Pyramid-Context Encoder Network for High-Quality Image Inpainting论文理解
  19. 求助在微信上班的工程师同僚!
  20. TP5 未定义变量:XXX

热门文章

  1. iOS 苹果官方Demo
  2. ​Android实现仿QQ登录可编辑下拉菜单
  3. cad怎么画立体图形教学_怎么在CAD中绘制三维立体图
  4. mysql 3306_允许远程链接mysql,开放3306端口
  5. 专题二:浅谈社交行业如何有效反欺诈
  6. html鼠标经过图片放大
  7. Untiy AVpro
  8. 蓝灯鱼AI人工智能、知识产权产品全面升级
  9. 春招面试阿里,面试官让我说说Java8的新特性
  10. H5_0021:判断平台和微信