设第一套为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. java自定义连接池

    1.java自定义连接池 1.1连接池的概念: 实际开发中"获取连接"或“释放资源”是非常消耗系统资源的两个过程,为了姐姐此类性能问题,通常情况我们采用连接池技术来贡献连接Conn ...

  2. h5与c3权威指南笔记--css3结构性伪类选择器root,not,empty,target

    root:将样式绑定到根元素(html中的根元素是<html></html>) 举个栗子 :root{ background-color: yellow; } body{ ba ...

  3. 在Docker中体验数据库之MySql

    在上一篇在Docker中体验数据库之Mongodb之后,这次记录一下在docker中安装mysql.过程要比Mongodb麻烦一点…… 参考网址: https://dev.mysql.com/doc/ ...

  4. Android Studio 添加引用Module项目

    新建Android项目,修改为Module 新建一个android项目 给项目命名,这里命名为MyLibrary,作为可引用的Module项目 点击下一步,选择一个Activity,点击ok 下面将这 ...

  5. Postman学习之【压力测试】

    Postman请自行下载 下面是在网上随便抓了一个请求地址来做演示,把请求地址填入地址栏,此请求为GET请求.点击Send发送请求,请求结果将会在下方显示出来.每次的请求历史数据,会被记录下来,但是经 ...

  6. 【HANA系列】SAP HANA XS使用JavaScript编程详解

    公众号:SAP Technical 本文作者:matinal 原文出处:http://www.cnblogs.com/SAPmatinal/ 原文链接:[HANA系列]SAP HANA XS使用Jav ...

  7. 西湖论剑2019复现-Web之首家线上赌场上线啦

    首页打开 经过测试发现name和code参数可控,但尝试注入没有发现注入点,于是直接扫描目录找思路 一扫描,果然有问题 目录扫描里面可以看到有一个/.DS_Store的文件,DS_Store是Mac ...

  8. Mysql5.6二进制包安装方法

    1.Download MySQL Community Server 访问mysql官方网站转到下载页https://dev.mysql.com/downloads/mysql/5.6.html#dow ...

  9. windows server 几大实时同步软件比较

    需求: 从Windows Server 主机A 到 Windows Server 主机B 之间同步目录 方案一: 1. 使用bat脚本 + 计划任务的方式 1.1 bat脚本 功能: 把主机A的C:\ ...

  10. C#:对字符串的各种处理

    字符串截取 SubString OR Remove string str3 = "123abc456"; //str3 = str3.Substring(0, i); //从左边开 ...