分析

假如实验皿是二维的,那么这道题便是一个二分图最小点覆盖问题,可以转化为二分图最大匹配问题,使用匈牙利算法解决。

考虑如何扩展到三维,首先我们发现一次操作的代价为\(min(x,y,z)\)。不难想到(\(?\)),每次操作的\(x,y,z\)中有一项为\(1\),另外两项为相应的最大值,即每次操作这个长方体的一个面(一“片”)时可以使答案最优。

题目中有一个限制条件为\(a \times b \times c \leq 5000\),可以发现\(min(a,b,c) \leq 17\)。假设\(c=min(a,b,c)\),我们可以把这个长方体分成\(c\)层,然后\(2^c\)枚举这\(c\)层中操作了哪些层。对于剩下的两维,便是第一段所述的二分图最小点覆盖问题。

代码

#include <iostream>
#include <cstdio>
#include <cstdlib>
#include <cstring>
#include <cmath>
#include <cctype>
#include <algorithm>
#define rin(i,a,b) for(int i=(a);i<=(b);i++)
#define rec(i,a,b) for(int i=(a);i>=(b);i--)
#define trav(i,a) for(int i=head[(a)];i;i=e[i].nxt)
using std::cin;
using std::cout;
using std::endl;
typedef long long LL; inline int read(){
int x=0;char ch=getchar();
while(ch<'0'||ch>'9') ch=getchar();
while(ch>='0'&&ch<='9'){x=(x<<3)+(x<<1)+ch-'0';ch=getchar();}
return x;
} const int MAXN=5005;
int n,m,h,tot;
int xx[MAXN],yy[MAXN],zz[MAXN];
int head[MAXN],ecnt;
int match[MAXN],tag;
int vis[MAXN];
struct Edge{
int to,nxt;
}e[MAXN]; inline void add_edge(int bg,int ed){
ecnt++;
e[ecnt].to=ed;
e[ecnt].nxt=head[bg];
head[bg]=ecnt;
} int dfs(int x){
trav(i,x){
int ver=e[i].to;
if(vis[ver]==tag) continue;
vis[ver]=tag;
if(!match[ver]||dfs(match[ver])){
match[ver]=x;
return 1;
}
}
return 0;
} int main(){
int T=read();
while(T--){
int typ;
h=read(),n=read(),m=read();
if(h<=std::min(n,m)) typ=1;
else if(n<=std::min(h,m)) typ=2;
else typ=3;
tot=0;
rin(i,1,h) rin(j,1,n) rin(k,1,m){
int temp=read();
if(!temp) continue;
tot++;
if(typ==1) zz[tot]=i,xx[tot]=j,yy[tot]=k;
else if(typ==2) zz[tot]=j,xx[tot]=i,yy[tot]=j;
else zz[tot]=k,xx[tot]=i,yy[tot]=j;
}
int hh=h,nn=n,mm=m;
if(typ==2) h=nn,n=hh;
else if(typ==3) h=mm,n=hh,m=nn;
int S=(1<<h)-1,ans=1e9;
rin(i,0,S){
int temp=__builtin_popcount(i);
ecnt=0;
rin(j,1,n) head[j]=0;
rin(j,1,m) match[j]=0;
rin(j,1,tot){
if((i>>(zz[j]-1))&1) continue;
add_edge(xx[j],yy[j]);
}
rin(j,1,n){
tag++;
if(dfs(j)) temp++;
if(temp>=ans) break;
}
ans=std::min(ans,temp);
}
printf("%d\n",ans);
}
return 0;
}

[BZOJ3140][HNOI2013]消毒:二分图匹配的更多相关文章

  1. [BZOJ3140][HNOI2013]消毒(二分图最小点覆盖)

    3140: [Hnoi2013]消毒 Time Limit: 10 Sec  Memory Limit: 128 MBSubmit: 1621  Solved: 676[Submit][Status] ...

  2. BZOJ.3140.[HNOI2013]消毒(二分图匹配 匈牙利)

    题目链接 不难想到每次一定是切一片. 如果是平面,很容易想到直接做二分图匹配.对于3维的? 可以发现min(a,b,c)的最大值只有\(\sqrt[3]{n}≈17\),我们暴力枚举这一最小值代表的是 ...

  3. [HNOI2013] 消毒 - 二分图匹配

    容易发现 \(a,b,c\) 中至少有一个 \(\leq 17\) 不妨将其调剂为 \(a\),那么我们可以暴力枚举哪些 \(x\) 片片要被直接削掉,剩下的拍扁成二维情况 二维时,如果有一个格子是 ...

  4. bzoj3140: [Hnoi2013]消毒

    Description 最近在生物实验室工作的小T遇到了大麻烦. 由于实验室最近升级的缘故,他的分格实验皿是一个长方体,其尺寸为a*b*c,a.b.c 均为正整数.为了实验的方便,它被划分为a*b*c ...

  5. bzoj3140: [Hnoi2013]消毒(二分图)

    题目描述 最近在生物实验室工作的小T遇到了大麻烦. 由于实验室最近升级的缘故,他的分格实验皿是一个长方体,其尺寸为a*b*c,a.b.c 均为正整数.为了实验的方便,它被划分为a*b*c个单位立方体区 ...

  6. [luogu3231 HNOI2013] 消毒 (二分图最小点覆盖)

    传送门 Description 最近在生物实验室工作的小T遇到了大麻烦. 由于实验室最近升级的缘故,他的分格实验皿是一个长方体,其尺寸为abc,a.b.c 均为正整数.为了实验的方便,它被划分为abc ...

  7. bzoj千题计划295:bzoj3140: [Hnoi2013]消毒

    http://www.lydsy.com/JudgeOnline/problem.php?id=3140 如果只有两维,那就是二分图最小点覆盖 现在是三维,但是a*b*c<=5000,说明最小的 ...

  8. 【BZOJ3140】消毒(二分图匹配)

    [BZOJ3140]消毒(二分图匹配) 题面 Description 最近在生物实验室工作的小T遇到了大麻烦. 由于实验室最近升级的缘故,他的分格实验皿是一个长方体,其尺寸为abc,a.b.c 均为正 ...

  9. P3231 [HNOI2013]消毒

    P3231 [HNOI2013]消毒 二维覆盖我们已经很熟悉了 扩展到三维,枚举其中较小的一维,这里定义为$a$ 以$a$为关键字状压,$1$表示该面全选 剩下的面和二维覆盖一样二分图匹配 如果还没接 ...

随机推荐

  1. DB.JDBC_jar_下载

    1.Download Microsoft JDBC Driver for SQL Server - SQL Server _ Microsoft Docs.html(https://docs.micr ...

  2. mysql常用知识点之limit

    limit函数的应用.limit后面跟整数,如limit 5,表示在结果集中取前5条:limit后跟整数区间,如limit 2,5,表示在结果集中 从第3条开始,取5条数据,第一个整数表示结果集的顺序 ...

  3. 分享之测试WebService小工具 STORM(转)

    http://www.cnblogs.com/yhuang/archive/2012/04/04/share_storm.html 最近的项目中,一直要使用到WebService,为了测试自己编写的W ...

  4. Spring Boot 深度调优,6得飞起~

    项目调优 作为一名工程师,项目调优这事,是必须得熟练掌握的事情. 在SpringBoot项目中,调优主要通过配置文件和配置JVM的参数的方式进行. 一.修改配置文件 关于修改配置文件applicati ...

  5. Animator通过按键切换动画不及时,动画延时切换问题

    再unity3D版本为Unity 5.2.1f1 (64-bit),再设置动画切换时有一个Has Exit Time属性,由于勾上了这个的原因

  6. Filter&Listener笔记

    ## 今日内容     1. Filter:过滤器     2. Listener:监听器 # Filter:过滤器     1. 概念:         * 生活中的过滤器:净水器,空气净化器,土匪 ...

  7. vue+element ui 时间格式化

    <el-table-column prop="startTime" label="日期" width="200" align=&quo ...

  8. FreeMarker三宗罪之优缺点

    FreeMarker是Quake Wang推荐我使用的.刚学FreeMarker的时候,发现freemarker真的很棒!简单易用,功能强大.但是用它做了几个项目以后开始不爽了. 一宗罪:freema ...

  9. idea解除版本控制

    解除版本控制删除两个文件: 1.idea中删除vcs.xml 2.在项目文件夹中删除.git 参考:https://blog.csdn.net/qq_37999340/article/details/ ...

  10. ELK + filebeat集群部署

    ELK + filebeat集群部署 一.ELK简介 1. Elasticsearch Elasticsearch是一个实时的分布式搜索分析引擎, 它能让你以一个之前从未有过的速度和规模,去探索你的数 ...