分析

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

考虑如何扩展到三维,首先我们发现一次操作的代价为\(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. js文件编码 的坑

  2. linux rz上传-sz下载

    yum install lrzsz -y rz     上传文件    不能传目录 如果要传目录需要打包成文件再上传 需要往哪里传东西,先进入哪个目录 rz -y   上传覆盖 sz -y 文件名  ...

  3. python学习之路 目录

    python Python基础-1 python由来 字符编码 注释 pyc文件 python变量 导入模块 获取用户输入 流程控制if while python基础-2 编码转换 pycharm 配 ...

  4. netstat -anop|more 查看网络队列

    nux下netstat --timers / -o详解及keepalive相关 第一列,一般有一下几种状态: keepalive - #表示是keepalive的时间计时 on - #表示是重发(re ...

  5. windows下重启nginx

    参考:从零学nginx-windows下reload配置无效及如何重启 因为Nginx是多进程模型,有一个主进程和多个子进程,主进程只负责管理子进程,基本的网络事件由各个子进程处理. 所以有时候当我们 ...

  6. vue中的provide和inject

    vue中的provide和inject:https://blog.csdn.net/viewyu12345/article/details/83011618

  7. java基础笔记(11)

    css 样式的设置主要有选择器+声明{}:声明里又分为属性和值: 注释代码:/*注释语句*/ 内联式:写在元素开始的标签里:例:<p style = "color:red;font-s ...

  8. 如何遍历div里面的文本内容,用each方法,

    如何遍历div里面的文本内容,然后进行匹配传来的数据,进行选中div,并进行CSS样式处理, for(i = 0; i< $(".itemMenuRowBox").child ...

  9. RESTful API 设计总结

    RESTful API 设计总结 @(技术-架构)[API, 规范, 设计] RESTful的接口设计风格应用的越来越广泛,包括Spring Cloud等微服务架构平台之间的调用都是以RESTful设 ...

  10. Redis数据类型及基本命令

    一.基础命令 提示:Redis不区分命令大小写 1.获得符合规则的键名列表 keys pattern    //pattern支持glob风格通配符格式 2.判断一个键是否存在 exists key  ...