[BZOJ 3140] 消毒
Link:
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] 消毒的更多相关文章
- BZOJ 3140 消毒(最小顶点覆盖)
题目链接:http://61.187.179.132/JudgeOnline/problem.php?id=3140 题意:最近在生物实验室工作的小T遇到了大麻烦. 由于实验室最近升级的缘故,他的分格 ...
- 【刷题】BZOJ 3140 [Hnoi2013]消毒
Description 最近在生物实验室工作的小T遇到了大麻烦. 由于实验室最近升级的缘故,他的分格实验皿是一个长方体,其尺寸为abc,a.b.c 均为正整数.为了实验的方便,它被划分为abc个单位立 ...
- bzoj 3140: [Hnoi2013]消毒
3140: [Hnoi2013]消毒 Description 最近在生物实验室工作的小T遇到了大麻烦. 由于实验室最近升级的缘故,他的分格实验皿是一个长方体,其尺寸为a*b*c,a.b.c 均为正整数 ...
- BZOJ.3140.[HNOI2013]消毒(二分图匹配 匈牙利)
题目链接 不难想到每次一定是切一片. 如果是平面,很容易想到直接做二分图匹配.对于3维的? 可以发现min(a,b,c)的最大值只有\(\sqrt[3]{n}≈17\),我们暴力枚举这一最小值代表的是 ...
- 3140:[HNOI2013]消毒 - BZOJ
题目描述 Description 最近在生物实验室工作的小 T 遇到了大麻烦. 由于实验室最近升级的缘故,他的分格实验皿是一个长方体,其尺寸为 a*b*c,a.b.c均为正整数.为了实验的方便,它被划 ...
- 【BZOJ】3140: [Hnoi2013]消毒
题目链接:http://www.lydsy.com/JudgeOnline/problem.php?id=3140 猜一发(显然)有结论:每次一定选择一个平面,即每次操作对答案的贡献都为$1$ 首先可 ...
- bzoj千题计划295:bzoj3140: [Hnoi2013]消毒
http://www.lydsy.com/JudgeOnline/problem.php?id=3140 如果只有两维,那就是二分图最小点覆盖 现在是三维,但是a*b*c<=5000,说明最小的 ...
- [BZOJ3140][HNOI2013]消毒(二分图最小点覆盖)
3140: [Hnoi2013]消毒 Time Limit: 10 Sec Memory Limit: 128 MBSubmit: 1621 Solved: 676[Submit][Status] ...
- BZOJ3140:[HNOI2013]消毒——题解
http://www.lydsy.com/JudgeOnline/problem.php?id=3140 https://www.luogu.org/problemnew/show/P3231 最近在 ...
随机推荐
- 【51NOD】1201 整数划分
[题意]将n划分成不同正整数的和的方案数. [算法]动态规划 [题解] 暴力:f[i][j]:只用前1..i的数字,总和为j的方案数 本质上是01背包,前i个物体,总质量为j的方案数 f[i][j]= ...
- shell 给未定义的变量设定默认值 ${parameter:-word}
参考: [ Unix & Linux ] Shell Demo $echo ${JENKINS_VERSION:-2.7.4} 2.7.4 $JENKINS_VERSION=2.99 $ech ...
- perl6中的hash定义(1)
,,,); say %hash; , b => ); say %hash2; my %hash3 = (:name('root'), :host('localost')); say %hash3 ...
- JS怎么刷新当前页面
JS怎么刷新当前页面 reload 方法,该方法强迫浏览器刷新当前页面.语法:location.reload([bForceGet]) 参数: bForceGet, 可选参数, 默认为 false,从 ...
- 《java并发编程实战》读书笔记7--线程池的使用
第8章 线程池的使用 8.1 在任务与执行策略之间的隐性耦合 虽然Executor框架为制定和修改执行策略都提供了相当大的灵活性,但并非所有的任务都适用所有的执行策略.有些类型的任务需要明确地指明执行 ...
- 《java并发编程实战》读书笔记5--任务执行, Executor框架
第6章 任务执行 6.1 在线程中执行任务 第一步要找出清晰的任务边界.大多数服务器应用程序都提供了一种自然的任务边界选择方式:以独立的请求为边界. -6.6.1 串行地执行任务 最简单的任务调度策略 ...
- 前后端分离,Vue+restfullframework
一.准备 修改源: npm config set registry https://registry.npm.taobao.org 创建脚手架: vue init webpack Vue项目名称 #I ...
- beatfullsoup
阅读目录 一 介绍 二 基本使用 三 遍历文档树 四 搜索文档树 五 修改文档树 六 总结 一 介绍 Beautiful Soup 是一个可以从HTML或XML文件中提取数据的Python库.它能够通 ...
- redis之(十三)redis的三种启动方式
Part I. 直接启动 下载 官网下载 安装 tar zxvf redis-2.8.9.tar.gz cd redis-2.8.9 #直接make 编译 make #可使用root用户执行`make ...
- Max Points on a Line——数学&&Map
Given n points on a 2D plane, find the maximum number of points that lie on the same straight line. ...