设第一套为A,第二套为B

先对于每个B[i]判断他能否替代A[j],即B[i]与其他的A线性无关

设$B[i]=\sum\limits_{k}{c[k]*A[k]}$,那么只要看c[j]是否等于零即可,如果c[j]=0,就意味着可以用A[j]以外的线性表达出B[i],所以不能B[i]替换A[j],否则可以

于是高斯消元求出c矩阵,问题就转化成了求二分图的最小字典序匹配

先跑一遍匈牙利判下是否无解,然后以它为基准解再贪心地求一遍答案

具体地说,你做到第i个的时候,前i-1都要固定住,其他的和普通匈牙利是一样的

 #include<bits/stdc++.h>
#include<tr1/unordered_map>
#define CLR(a,x) memset(a,x,sizeof(a))
#define MP make_pair
using namespace std;
typedef long long ll;
typedef unsigned long long ull;
typedef pair<int,int> pa;
typedef long double ld;
const int maxn=,P=; inline ll rd(){
ll x=;char c=getchar();int neg=;
while(c<''||c>''){if(c=='-') neg=-;c=getchar();}
while(c>=''&&c<='') x=x*+c-'',c=getchar();
return x*neg;
} int N;
int a[maxn][maxn*],b[maxn][maxn],c[maxn][maxn];
bool can[maxn][maxn]; inline int fpow(int x,int y){
int re=;
while(y){
if(y&) re=1ll*x*re%P;
x=1ll*x*x%P,y>>=;
}return re;
} inline void getinv(){
for(int i=;i<=N;i++){
a[i][i+N]=;
}
for(int i=;i<=N;i++){
int mi=i;
for(int j=i+;j<=N;j++) if(a[j][i]) mi=j;
swap(a[mi],a[i]);
int iv=fpow(a[i][i],P-);
for(int j=N*;j>=i;j--) a[i][j]=1ll*a[i][j]*iv%P;
for(int j=i+;j<=N;j++){
for(int k=N*;k>=i;k--) a[j][k]=(a[j][k]-1ll*a[i][k]*a[j][i])%P;
}
}
for(int i=N;i;i--){
for(int j=i-;j;j--){
for(int k=N+;k<=N*;k++) a[j][k]=(a[j][k]-1ll*a[j][i]*a[i][k])%P;
}
}
for(int i=;i<=N;i++){
for(int j=;j<=N;j++) a[i][j]=a[i][j+N];
}
} int bel[maxn],to[maxn];bool flag[maxn]; bool dfs(int x){
for(int i=;i<=N;i++){
if(!can[x][i]||flag[i]) continue;
flag[i]=;
if(!bel[i]||dfs(bel[i])){bel[i]=x,to[x]=i;return ;}
}return ;
}
bool dfs2(int x,int y){
for(int i=;i<=N;i++){
if(!can[x][i]||flag[i]) continue;
flag[i]=;
if(bel[i]==y||(bel[i]>y&&dfs2(bel[i],y))){to[x]=i,bel[i]=x;return ;}
}return ;
} int main(){
//freopen("","r",stdin);
N=rd();
for(int i=;i<=N;i++){
for(int j=;j<=N;j++) a[i][j]=rd();
}
for(int i=;i<=N;i++){
for(int j=;j<=N;j++) b[i][j]=rd();
}
getinv();
for(int i=;i<=N;i++){
for(int j=;j<=N;j++){
for(int k=;k<=N;k++){
c[i][j]=(c[i][j]+1ll*b[i][k]*a[k][j])%P;
}
}
}
for(int i=;i<=N;i++){
for(int j=;j<=N;j++){
if(c[i][j]) can[j][i]=;
}
}/*
for(int i=rd();i;i--){
int a=rd(),b=rd();
can[a][b]=1;
}*/
bool bl=;
for(int i=;i<=N;i++){
CLR(flag,);
if(!dfs(i)){bl=;break;}
}
if(!bl) printf("NIE\n");
else{
printf("TAK\n");
for(int i=;i<=N;i++){
CLR(flag,);
dfs2(i,i);
}
for(int i=;i<=N;i++){
printf("%d\n",to[i]);
}
}
return ;
}

bzoj3168 钙铁锌硒维生素 (矩阵求逆+二分图最小字典序匹配)的更多相关文章

  1. [模板] 匈牙利算法&&二分图最小字典序匹配

    匈牙利算法 简介 匈牙利算法是一种求二分图最大匹配的算法. 时间复杂度: 邻接表/前向星: \(O(n * m)\), 邻接矩阵: \(O(n^3)\). 空间复杂度: 邻接表/前向星: \(O(n ...

  2. HDU 1533:Going Home(KM算法求二分图最小权匹配)

    http://acm.hdu.edu.cn/showproblem.php?pid=1533 Going Home Problem Description   On a grid map there ...

  3. BZOJ 3168 Luogu P4100 [HEOI2013]钙铁锌硒维生素 (矩阵求逆、二分图匹配)

    线性代数+图论好题. 题目链接: (bzoj) https://www.lydsy.com/JudgeOnline/problem.php?id=3168 (luogu) https://www.lu ...

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

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

  5. HDU 1533 二分图最小权匹配 Going Home

    带权二分图匹配,把距离当做权值,因为是最小匹配,所以把距离的相反数当做权值求最大匹配. 最后再把答案取一下反即可. #include <iostream> #include <cst ...

  6. [ACM] POJ 3686 The Windy&#39;s (二分图最小权匹配,KM算法,特殊建图)

    The Windy's Time Limit: 5000MS   Memory Limit: 65536K Total Submissions: 4158   Accepted: 1777 Descr ...

  7. [ACM] HDU 1533 Going Home (二分图最小权匹配,KM算法)

    Going Home Time Limit: 10000/5000 MS (Java/Others)    Memory Limit: 65536/32768 K (Java/Others) Tota ...

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

    正题 题目链接:https://www.luogu.com.cn/problem/P4100 题目大意 给出\(n\)个线性无关的向量\(A_i\),然后给出\(n\)个向量\(B_i\),求一个字典 ...

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

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

随机推荐

  1. 上传图片截图预览控件不显示cropper.js 跨域问题

    上传图片到图片服务器,因为域名不同,多以会有跨域问题. No 'Access-Control-Allow-Origin' header is present on the requested reso ...

  2. html和css的使用方法以及样式

    布局步骤 第一步: 清除默认样式第二步: 划分模块第三步: 设置模块的大小以及位置第四步: 划分下一级模块 html和css 引入网页头像 <link rel="shortcut ic ...

  3. hadoop集群的搭建

    hadoop集群的搭建 1.ubuntu 14.04更换成阿里云源 刚刚开始我选择了nat模式,所有可以连通网络,但是不能ping通,我就是想安装一下mysql,因为安装手动安装mysql太麻烦了,然 ...

  4. 【java】Freemarker 动态生成word(带图片表格)

    1.添加freemarker.jar 到java项目. 2.新建word文档. 3.将文档另存为xml 格式. 4.将xml格式化后打开编辑(最好用notepad,有格式),找到需要替换的内容,将内容 ...

  5. MySQL 关于性能的参数配置梳理

    以下List是我们常见的MySQL参数配置,这个参数对提高实例的性能大有裨益. 其中 建议设置值,仅供参考,需要根据自己的业务场景和硬件资源仔细推敲. 参数 设置说明 建议设置值 lower_case ...

  6. sql 排序函数ROW_NUMBER分页返回数据

    分页从数据库返回一张表的某些条数据 假设我需要查询 系统表 sys.all_columns中的数据,每次查询10条 第一次查询第1-10条数据 第二次查询第11-20条数据 第三次查询第21-30条数 ...

  7. PIC单片机基础1

    1.PIC单片机总线结构——哈佛结构:即指令和数据空间是完全分开的,所以与常见的微控制器不同的一点是,程序和数据总线可以采用不同的宽度.以PIC16F684单片机为例,数据总线是8位的,但指令总线位数 ...

  8. Swift中的for循环基本使用

    OC中的for循环写法: ;i < ;i++) { NSLog(@"i=%zd",i); } Swift中的for循环写法: let a = ; ..< a { pri ...

  9. SpringBoot文档

    一.Spring Boot 入门 1.Hello World探究 1.POM文件 1.父项目 <parent>   <groupId>org.springframework.b ...

  10. redis数据库安装 redis持久化及主从复制

    ----------------------------------------安装redis-5.0.4---------------------------------------- wget h ...