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 ...
随机推荐
- 分布式缓存Hazelcast案例一
分布式缓存Hazelcast案例一 Hazelcast IMDG Architecture 今天先到这儿,希望对您技术领导力, 企业管理,物联网, 系统架构设计与评估,团队管理, 项目管理, 产品管 ...
- Django学习之六:Django 常用模块导入记忆
Django 常用模块导入记忆 django相关 1. urls相关操作 from django.urls import path, re_path, include from django.urls ...
- Vue 单选框与单选框组 组件
radio组件 v-model : 通过当然绑定的值与input上的value值来确定当前选中项. 在父作用域中通过active设置当前默认选中项,如果选中项发生改变后通过input事件通知传递到父 ...
- 20190409-层叠の层叠上下文、层叠水平、层叠顺序、z-index、伪元素层叠
写在前面乱七八糟的前言: 此"八卦"的源于,在写下图这个圆滚滚的导航布局时,使用元素及其伪元素加上绝对定位完成,但遇到:before或:after伪元素与元素的层叠顺序,就是伪元素 ...
- SpringIOC/DI(2)
2019-03-08/09:24:37 开发环境:IDEA 1.创建Spring项目 File--New--project--Spring--Creat empty Spring-config.xml ...
- 生鲜配送管理系统_升鲜宝 V2.0 小程序辅助系统工具矩阵系列相关说明
随着微信红利的进一步释放,使用人群的不断增加,小程序从2017年01月第一批开发者出现后,2018年小程序得到快速的提升,小程序开发的相关应用小工具得到了市场的青咪,社会化大分工.协同.共享.协作的思 ...
- 生鲜配送管理系统_升鲜宝V2.0 价格组功能 操作说明_15382353715
价格组功能是B端供应链系统,必不可少的一个功能,其主要实现不同的客户不同的价格,B端系统有一个最大的不同就是,有些商品后台下单人员能看到的.有些商品在销售的那一瞬间,还不知道价格.所以这些商品只有后台 ...
- Linux下使用yum安装软件命令
1.yum list | grep 要下载的文件名字2.yum install 完整文件名字3.rpm -qa | grep 软件名字 //查看版本
- vue环境搭建及项目介绍
搭建开发环境(搭建开发环境前必须安装node.js): 1.安装vue脚手架工具 $ npm install -g vue-cli 2.创建项目(注意项目名字不要有大写字母) vue init < ...
- Android Studio 添加引用Module项目
新建Android项目,修改为Module 新建一个android项目 给项目命名,这里命名为MyLibrary,作为可引用的Module项目 点击下一步,选择一个Activity,点击ok 下面将这 ...