Link:

BZOJ 3140 传送门

Solution:

挺好的一道暴力题

首先发现可以每次贪心选择宽度为1的一面,即$1*x*y,1*x*z,1*y*z$

那么对于与该面垂直的面,相当于解决了一行/一列

于是我们可以先考虑一个二维问题:

每次选取一行/一列要耗费一个代价,询问要覆盖所有染色点需要多大代价

由于对于每个点的横纵坐标都是映射关系,且横/纵坐标是两个独立的集合

于是将染色点的横/纵坐标连边后问题转化为最小点覆盖问题,也就是二分图最大匹配

为了将三维问题转化为当前可做的二维问题,就只能对一维暴力处理了:

由于$x*y*z\le 5000$,因此其中至少有一维长度小于17

对于这一维我们状压枚举进行涂色的切面,那么解决剩下节点的切面都与该维切面垂直

问题就转换成了上述的二维问题,只不过点数多了一些且可能重复

Code:

#include <bits/stdc++.h>

using namespace std;
const int MAXN=;
struct edge{int nxt,to;}e[MAXN<<];
struct node{int x,y,z;}dat[MAXN];
int T,x,y,z,mn,head[MAXN],vis[MAXN],mat[MAXN],used[MAXN],res,tot,cnt,idx=; void add_edge(int from,int to)//注意别加成2条边了……
{e[++tot].nxt=head[from];e[tot].to=to;head[from]=tot;} int dfs(int x)
{
vis[x]=idx;
for(int i=head[x];i;i=e[i].nxt)
{
int v=e[i].to,m=mat[v];
if(m==-||vis[m]!=idx&&dfs(m))
{mat[v]=x;return ;}
}
return ;
} void solve(int k)
{
tot=;int sum=;
for(int i=;i<=x;i++) used[i]=;
for(int i=;i<=y;i++) head[i]=;
for(int i=;i<=z;i++) mat[i]=-; for(int i=;i<x;i++)
if(k&(<<i)) used[i+]=,sum++;
for(int i=;i<=cnt;i++)
if(!used[dat[i].x])
add_edge(dat[i].y,dat[i].z); for(int i=;i<=y;i++,idx++) sum+=dfs(i);
res=min(res,sum);
} int main()
{
scanf("%d",&T);
while(T--)
{
scanf("%d%d%d",&x,&y,&z);
cnt=;res=<<;
mn=min(x,min(y,z));
for(int i=;i<=x;i++)
for(int j=;j<=y;j++)
for(int k=;k<=z;k++)
{
int t;scanf("%d",&t);
if(t) dat[++cnt]={i,j,k};
}
if(mn==y)
{swap(x,y);for(int i=;i<=cnt;i++) swap(dat[i].x,dat[i].y);}
if(mn==z)
{swap(x,z);for(int i=;i<=cnt;i++) swap(dat[i].x,dat[i].z);} for(int i=;i<(<<x);i++) solve(i);
printf("%d\n",res);
}
return ;
}

[BZOJ 3140] 消毒的更多相关文章

  1. BZOJ 3140 消毒(最小顶点覆盖)

    题目链接:http://61.187.179.132/JudgeOnline/problem.php?id=3140 题意:最近在生物实验室工作的小T遇到了大麻烦. 由于实验室最近升级的缘故,他的分格 ...

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

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

  3. bzoj 3140: [Hnoi2013]消毒

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

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

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

  5. 3140:[HNOI2013]消毒 - BZOJ

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

  6. 【BZOJ】3140: [Hnoi2013]消毒

    题目链接:http://www.lydsy.com/JudgeOnline/problem.php?id=3140 猜一发(显然)有结论:每次一定选择一个平面,即每次操作对答案的贡献都为$1$ 首先可 ...

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

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

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

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

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

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

随机推荐

  1. UIPageControl---iOS-Apple苹果官方文档翻译

    本系列所有开发文档翻译链接地址:iOS7开发-Apple苹果iPhone开发Xcode官方文档翻译PDF下载地址 //转载请注明出处--本文永久链接:http://www.cnblogs.com/Ch ...

  2. 获取子iframe框架的元素

    我们常常遇到使用iframe框的时候,该iframe框不能根据自己内部的内容撑起来的这种问题 必要条件:不能在跨域的情况下...本地可以放到localhost下进行测试 //父页面index.html ...

  3. 用例图(Use Case Diagram)

    用例图(Use Case Diagram) 执行者/参与者(Actor): 表示与您的应用程序或系统进行交互的用户.组织或外部系统.用一个小人表示. 用例(Use Case): 即系统具有的功能,在用 ...

  4. 安装FFMpeg CentOS 7

    https://linuxadmin.io/install-ffmpeg-on-centos-7/

  5. (二十一)Makefile例子

    ROOT_PROJECT = .DIR_INC = -I$(ROOT_PROJECT)/include -I$(ROOT_PROJECT)/include/NE10 DIR_BIN = $(ROOT_ ...

  6. HDU 5627 Clarke and MST &意义下最大生成树 贪心

    题目链接:http://acm.hdu.edu.cn/showproblem.php?pid=5627 题意:Bestcoder的一道题,让你求&意义下的最大生成树. 解法: 贪心,我们从高位 ...

  7. mybatis源码阅读(动态代理)

    这一篇文章主要是记录Mybatis的动态代理学习成果,如果对源码感兴趣,可以看一下上篇文章  https://www.cnblogs.com/ChoviWu/p/10118051.html 阅读本篇的 ...

  8. zookeeper安装和搭建集群方式(window)

    1.   概述 ZooKeeper是Hadoop的正式子项目,它是一个针对大型分布式系统的可靠协调系统,提供的功能包括:配置维护.名字服务.分布式同步.组服务等.ZooKeeper的目标就是封装好复杂 ...

  9. 获取GUID的方法

    uses QString; procedure TForm12.btn1Click(Sender: TObject); var g: TGUID; begin //方法1(Guid的Helper)-- ...

  10. 《逐梦旅程 WINDOWS游戏编程之从零开始》笔记1——创建窗口&GDI

    第1章 创建窗口 步骤: 窗口类的设计 窗口类的注册 窗口的正式创建 窗口的显示与更新 消息循环体系 窗口过程函数处理消息 1. 设计:使用WNDCLASSEX结构体,这里注意的是C++中的结构体中的 ...