bzoj3168 钙铁锌硒维生素 (矩阵求逆+二分图最小字典序匹配)
设第一套为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 钙铁锌硒维生素 (矩阵求逆+二分图最小字典序匹配)的更多相关文章
- [模板] 匈牙利算法&&二分图最小字典序匹配
匈牙利算法 简介 匈牙利算法是一种求二分图最大匹配的算法. 时间复杂度: 邻接表/前向星: \(O(n * m)\), 邻接矩阵: \(O(n^3)\). 空间复杂度: 邻接表/前向星: \(O(n ...
- HDU 1533:Going Home(KM算法求二分图最小权匹配)
http://acm.hdu.edu.cn/showproblem.php?pid=1533 Going Home Problem Description On a grid map there ...
- BZOJ 3168 Luogu P4100 [HEOI2013]钙铁锌硒维生素 (矩阵求逆、二分图匹配)
线性代数+图论好题. 题目链接: (bzoj) https://www.lydsy.com/JudgeOnline/problem.php?id=3168 (luogu) https://www.lu ...
- BZOJ 3168 Heoi2013 钙铁锌硒维生素 矩阵求逆+匈牙利算法
题目大意:给定一个n∗n的满秩矩阵A和一个n∗n的矩阵B.求一个字典序最小的1...n的排列a满足将随意一个Ai换成Bai后矩阵A仍然满秩 我们考虑建立一个二分图.假设Ai能换成Bj.就在i−> ...
- HDU 1533 二分图最小权匹配 Going Home
带权二分图匹配,把距离当做权值,因为是最小匹配,所以把距离的相反数当做权值求最大匹配. 最后再把答案取一下反即可. #include <iostream> #include <cst ...
- [ACM] POJ 3686 The Windy's (二分图最小权匹配,KM算法,特殊建图)
The Windy's Time Limit: 5000MS Memory Limit: 65536K Total Submissions: 4158 Accepted: 1777 Descr ...
- [ACM] HDU 1533 Going Home (二分图最小权匹配,KM算法)
Going Home Time Limit: 10000/5000 MS (Java/Others) Memory Limit: 65536/32768 K (Java/Others) Tota ...
- P4100-[HEOI2013]钙铁锌硒维生素【矩阵求逆,最大匹配】
正题 题目链接:https://www.luogu.com.cn/problem/P4100 题目大意 给出\(n\)个线性无关的向量\(A_i\),然后给出\(n\)个向量\(B_i\),求一个字典 ...
- BZOJ3168. [HEOI2013]钙铁锌硒维生素(线性代数+二分图匹配)
题目链接 https://www.lydsy.com/JudgeOnline/problem.php?id=3168 题解 首先,我们需要求出对于任意的 \(i, j(1 \leq i, j \leq ...
随机推荐
- java自定义连接池
1.java自定义连接池 1.1连接池的概念: 实际开发中"获取连接"或“释放资源”是非常消耗系统资源的两个过程,为了姐姐此类性能问题,通常情况我们采用连接池技术来贡献连接Conn ...
- h5与c3权威指南笔记--css3结构性伪类选择器root,not,empty,target
root:将样式绑定到根元素(html中的根元素是<html></html>) 举个栗子 :root{ background-color: yellow; } body{ ba ...
- 在Docker中体验数据库之MySql
在上一篇在Docker中体验数据库之Mongodb之后,这次记录一下在docker中安装mysql.过程要比Mongodb麻烦一点…… 参考网址: https://dev.mysql.com/doc/ ...
- Android Studio 添加引用Module项目
新建Android项目,修改为Module 新建一个android项目 给项目命名,这里命名为MyLibrary,作为可引用的Module项目 点击下一步,选择一个Activity,点击ok 下面将这 ...
- Postman学习之【压力测试】
Postman请自行下载 下面是在网上随便抓了一个请求地址来做演示,把请求地址填入地址栏,此请求为GET请求.点击Send发送请求,请求结果将会在下方显示出来.每次的请求历史数据,会被记录下来,但是经 ...
- 【HANA系列】SAP HANA XS使用JavaScript编程详解
公众号:SAP Technical 本文作者:matinal 原文出处:http://www.cnblogs.com/SAPmatinal/ 原文链接:[HANA系列]SAP HANA XS使用Jav ...
- 西湖论剑2019复现-Web之首家线上赌场上线啦
首页打开 经过测试发现name和code参数可控,但尝试注入没有发现注入点,于是直接扫描目录找思路 一扫描,果然有问题 目录扫描里面可以看到有一个/.DS_Store的文件,DS_Store是Mac ...
- Mysql5.6二进制包安装方法
1.Download MySQL Community Server 访问mysql官方网站转到下载页https://dev.mysql.com/downloads/mysql/5.6.html#dow ...
- windows server 几大实时同步软件比较
需求: 从Windows Server 主机A 到 Windows Server 主机B 之间同步目录 方案一: 1. 使用bat脚本 + 计划任务的方式 1.1 bat脚本 功能: 把主机A的C:\ ...
- C#:对字符串的各种处理
字符串截取 SubString OR Remove string str3 = "123abc456"; //str3 = str3.Substring(0, i); //从左边开 ...