[BZOJ3140][HNOI2013]消毒:二分图匹配
分析
假如实验皿是二维的,那么这道题便是一个二分图最小点覆盖问题,可以转化为二分图最大匹配问题,使用匈牙利算法解决。
考虑如何扩展到三维,首先我们发现一次操作的代价为\(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]消毒:二分图匹配的更多相关文章
- [BZOJ3140][HNOI2013]消毒(二分图最小点覆盖)
3140: [Hnoi2013]消毒 Time Limit: 10 Sec Memory Limit: 128 MBSubmit: 1621 Solved: 676[Submit][Status] ...
- BZOJ.3140.[HNOI2013]消毒(二分图匹配 匈牙利)
题目链接 不难想到每次一定是切一片. 如果是平面,很容易想到直接做二分图匹配.对于3维的? 可以发现min(a,b,c)的最大值只有\(\sqrt[3]{n}≈17\),我们暴力枚举这一最小值代表的是 ...
- [HNOI2013] 消毒 - 二分图匹配
容易发现 \(a,b,c\) 中至少有一个 \(\leq 17\) 不妨将其调剂为 \(a\),那么我们可以暴力枚举哪些 \(x\) 片片要被直接削掉,剩下的拍扁成二维情况 二维时,如果有一个格子是 ...
- bzoj3140: [Hnoi2013]消毒
Description 最近在生物实验室工作的小T遇到了大麻烦. 由于实验室最近升级的缘故,他的分格实验皿是一个长方体,其尺寸为a*b*c,a.b.c 均为正整数.为了实验的方便,它被划分为a*b*c ...
- bzoj3140: [Hnoi2013]消毒(二分图)
题目描述 最近在生物实验室工作的小T遇到了大麻烦. 由于实验室最近升级的缘故,他的分格实验皿是一个长方体,其尺寸为a*b*c,a.b.c 均为正整数.为了实验的方便,它被划分为a*b*c个单位立方体区 ...
- [luogu3231 HNOI2013] 消毒 (二分图最小点覆盖)
传送门 Description 最近在生物实验室工作的小T遇到了大麻烦. 由于实验室最近升级的缘故,他的分格实验皿是一个长方体,其尺寸为abc,a.b.c 均为正整数.为了实验的方便,它被划分为abc ...
- bzoj千题计划295:bzoj3140: [Hnoi2013]消毒
http://www.lydsy.com/JudgeOnline/problem.php?id=3140 如果只有两维,那就是二分图最小点覆盖 现在是三维,但是a*b*c<=5000,说明最小的 ...
- 【BZOJ3140】消毒(二分图匹配)
[BZOJ3140]消毒(二分图匹配) 题面 Description 最近在生物实验室工作的小T遇到了大麻烦. 由于实验室最近升级的缘故,他的分格实验皿是一个长方体,其尺寸为abc,a.b.c 均为正 ...
- P3231 [HNOI2013]消毒
P3231 [HNOI2013]消毒 二维覆盖我们已经很熟悉了 扩展到三维,枚举其中较小的一维,这里定义为$a$ 以$a$为关键字状压,$1$表示该面全选 剩下的面和二维覆盖一样二分图匹配 如果还没接 ...
随机推荐
- kafka学习(八)
管理kafka 主题操作 1.在集群里创建一个主题需要用到3个参数.这些参数是必须提供的,尽管有些已经有broker级别的默认值. 主题名字,想要创建的主题的名字,主题名字可以包含字母,数 ...
- 第四周课程总结与第二次实验报告(Java简单类与对象)
1.写一个名为Rectangle的类表示矩形.其属性包括宽width.高height和颜色color,width和height都是double型的,而color则是String类型的.要求该类具有: ...
- 几个 BeanUtils 中的坑,千万别踩!
背景 最近项目中在和第三方进行联调一个接口,我们这边发送http请求给对方,然后接收对方的回应,代码都是老代码. 根据注释,对方的SDK中写好的Request类有一个无法序列化的bug,所以这边重新写 ...
- java基础笔记(6)
xml文件的写入 通过dom生成xml文件: package com.writexml; import java.io.File; import javax.xml.parsers.DocumentB ...
- CSP-J&S 2019游记
$Day -???$ 和爱国爱党的$LQX$书记打了个赌,谁$TG$分低请另一个京味斋. $Day 0$ 机房同学去聚餐,美其名曰"散伙饭",可能又有几个进队的... 我没有去,因 ...
- Linux文档整理之【Nginx安装Docker】
这次整理的文档是Docker安装 先说明下我用的系统是Linux Centos,不同的Linux版本差别不大. 1.安装依赖包 sudo yum install -y yum-utils device ...
- Cross-Origin-Resource-Sharing-Solutions
from:https://github.com/hijiangtao/hijiangtao.github.io/blob/master/_posts/2017-06-13-Cross-Origin-R ...
- OC+swift混编
作者:fengsh998 原文地址:http://blog.csdn.net/fengsh998/article/details/34440159 转载请注明出处 如果觉得文章对你有所帮助,请通过留言 ...
- Cobbler自动化装机
Cobbler自动化装机 一个可以实现批量安装系统的Linxu应用程序,他可以实现同个服务器安装不同操作系统版本. 准备环境 开启两个网卡.一个仅主机模式,一个桥接模式,仅主机模式对内提供cobble ...
- linux系统特殊权限位 suid、sgid、sticky
linux系统特殊权限位 suid.sgid.stickysuid 使任意用户获得用文件属主相同的权限,sgid使用户获得与文件属组相同的权限(通过sgid获得的权限等同于同一用户组的权限) 表示方法 ...