前置技能:poj3041


如果是二维平面有一些方块,这些方块被染了黑色,你每次可以选择 \((x,y)\) 的区域染成白色,代价是 \(\min(x,y)\),问你付出的最小代价



显然我们不会这么染



因为这样我们的代价是 \(\min(x,y)\),为了研究的方便我们假设 \(x\) 比 \(y\) 小,那我们就相当于染 \(x\) 次 \(1 \times y\) 的区域,因此一次染一片总是不如一次染一条的。下面这么染就很好



所以我们建立二分图,对于每个黑色块 \((x,y)\),我们将其处于第一部的 \(x\) 与处于第二部的 \(y\) 连接,求一个最小点覆盖。二分图中最小点覆盖=最大匹配,就得到了答案。


回到本题,题目中扩展到了三维空间,我们也有类似的想法。然而我们并不会三分图匹配这种东西……

观察到 \(abc \leq 5000\),反证法可以轻易地证出 \(a,b,c\) 中有一个 \(\leq \sqrt[3]{5000} \approx 17.1\),为了研究方便我们钦定是 \(a \leq \sqrt[3]{5000}\),这样就暴力枚举 \(1\ldots a\) 中的某一层是直接削掉还是一会儿再处理(只有这两种情况,别的都不好,想一想为什么)。

对于没有被直接削掉的层,我们把它们剥离出来,然后拍扁成二维平面上的问题求解。


代码。跑得不是很快,借鉴了一下网上的代码

#include <iostream>
#include <cstring>
#include <cstdio>
using namespace std;
int T, hea[5005], cnt, a, b, c, minn, sx[4][5005], uu, ans, lnk[5005], qaq;
bool isn[5005], qwq[25], vis[5005];
struct Edge{
int too, nxt;
}edge[5005];
void add_edge(int fro, int too){
edge[++cnt].nxt = hea[fro];
edge[cnt].too = too;
hea[fro] = cnt;
}
bool dfs(int x){
for(int i=hea[x]; i; i=edge[i].nxt){
int t=edge[i].too;
if(!vis[t]){
vis[t] = true;
if(!lnk[t] || dfs(lnk[t])){
lnk[t] = x;
return true;
}
}
}
return false;
}
void work(int x){
for(int i=1; i<=b; i++) hea[i] = 0;
cnt = 0;
for(int i=1; i<=c; i++) lnk[i] = 0;
int tmp=0;
for(int i=0; i<a; i++){
if(x&(1<<i)) qwq[i+1] = false, tmp++;
else qwq[i+1] = true;
}
for(int i=1; i<=qaq; i++)
if(qwq[sx[1][i]])
add_edge(sx[2][i], sx[3][i]);
for(int i=1; i<=b; i++){
for(int j=1; j<=c; j++) vis[j] = false;
if(dfs(i)) tmp++;
}
ans = min(tmp, ans);
}
int main(){
cin>>T;
while(T--){
qaq = 0;
ans = 0x3f3f3f3f;
scanf("%d %d %d", &a, &b, &c);
minn = min(a, min(b, c));
for(int i=1; i<=a; i++)
for(int j=1; j<=b; j++)
for(int k=1; k<=c; k++){
scanf("%d", &uu);
if(!uu) continue;
sx[1][++qaq] = i;
sx[2][qaq] = j;
sx[3][qaq] = k;
}
if(minn==b) swap(a, b), swap(sx[1], sx[2]);
else if(minn==c) swap(a, c), swap(sx[1], sx[3]);
for(int i=0; i<(1<<a); i++)
work(i);
printf("%d\n", ans);
}
return 0;
}

luogu3231 [HNOI2013]消毒的更多相关文章

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

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

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

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

  3. bzoj 3140: [Hnoi2013]消毒

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

  4. P3231 [HNOI2013]消毒

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

  5. 3140:[HNOI2013]消毒 - BZOJ

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

  6. bzoj3140: [Hnoi2013]消毒

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

  7. 【刷题】BZOJ 3140 [Hnoi2013]消毒

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

  8. BZOJ3140:[HNOI2013]消毒——题解

    http://www.lydsy.com/JudgeOnline/problem.php?id=3140 https://www.luogu.org/problemnew/show/P3231 最近在 ...

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

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

随机推荐

  1. 图像处理库CImg

    CImg 是一个用C++编写的开源数字图像处理库.   作者介绍   作者David Tschumperlé, 之前是法国La Rochelle大学的一名教授,现受雇于CNRS 图像组.据说作者从19 ...

  2. vue.js2.0实战填坑记录

    访https://github.com/bailicangdu/vue2-elm的PC商城 在创建的 router 对象中,如果不配置 mode,就会使用默认的 hash 模式,该模式下会将路径格式化 ...

  3. 初始Mybatis,好累,自己感觉自己快坚持不了了

    Mybatis1.持久化 持久化,就是内存数据和硬盘数据状态的转换 2.ORM思想Object Relation Mapping 对象关系映射 3.MyBatis入门案例 3.1导入jar包 依赖 & ...

  4. Windows7环境下Apache连接MySQL提示“连接已重置”的解决办法

    win7下手动搭建wamp环境,碰到的几个坑总结下, 1.能正常访问php和html类型文件,但是访问项目文件时老是连接被重置,后来总结是数据库的问题,就写测试用例测试php能否成功调用数据库, &l ...

  5. 从零开始利用vue-cli搭建简单音乐网站(七)

    这几天完成了歌曲收藏功能,先看最后效果: 新注册用户:“newuser”,进入“我的音乐界面如下所示” 点击新建歌单,输入:“新歌单”,确认,如下: 目前还没有歌曲,打开音乐界面,点击收藏功能,如下, ...

  6. error: stray '\343' in program 问题解决

          当我们从网上copy一段代码后,总会出现这个问题.博主在Arduino环境中也出现了,so,这个问题应该是C语言和C++编译器中才会出现的. test_int:19: error: str ...

  7. 小白学phoneGap《构建跨平台APP:phoneGap移动应用实战》连载二(生命周期)

    4.1 什么是生命周期 想要真正地理解PhoneGap应用开发的内涵,首先需要理解什么是生命周期.这在字面上其实非常容易理解,一个应用从开始运行被手机加载到应用被退出之间的过程就称之为一个生命周期.为 ...

  8. Hadoop2.6.2的Eclipse插件的使用

    欢迎转载,且请注明出处,在文章页面明显位置给出原文连接. 本文链接:http://www.cnblogs.com/zdfjf/p/5178197.html 首先给出eclipse插件的下载地址:htt ...

  9. 根据HTML语义化编码

    语义化标签——http://www.html5jscss.com/html5-semantics-section.html 写HTML代码时应注意什么? 尽可能少的使用无语义的标签div和span: ...

  10. k8s 基础概念和术语

    Master k8s里的master指的是集群控制节点,每个k8s集群里需要有一个Master节点来负责整个集群的管理和控制,基本k8s所有控制命令都发给它,它负责整个具体的执行过程,后面执行操作基本 ...