传送门

Description

最近在生物实验室工作的小T遇到了大麻烦。 由于实验室最近升级的缘故,他的分格实验皿是一个长方体,其尺寸为abc,a、b、c 均为正整数。为了实验的方便,它被划分为abc个单位立方体区域,每个单位立方体尺寸为111。用(i,j,k)标识一个单位立方体,1 <=i<=a,1<=j<=b,1<=k<=c。这个实验皿已经很久没有人用了,现在,小T被导师要求将其中一些单位立方体区域进 行消毒操作(每个区域可以被重复消毒)。

而由于严格的实验要求,他被要求使用一种特定 的F试剂来进行消毒。 这种F试剂特别奇怪,每次对尺寸为xyz的长方体区域(它由xyz个单位立方体组 成)进行消毒时,只需要使用min{x,y,z}单位的F试剂。F试剂的价格不菲,这可难倒了小 T。

现在请你告诉他,最少要用多少单位的F试剂。(注:min{x,y,z}表示x、y、z中的最小 者。)

Input

第一行是一个正整数D,表示数据组数。接下来是D组数据,每组数据开头是三个数a,b,c表示实验皿的尺寸。接下来会出现a个b 行c列的用空格隔开的01矩阵,0表示对应的单位立方体不要求消毒,1表示对应的单位立方体需要消毒;例如,如果第1个01矩阵的第2行第3列为1,则表示单位立方体(1,2,3)需要被消毒。输入保证满足abc<=5000,T<=3。

Output

仅包含D行,每行一个整数,表示对应实验皿最少要用多少单位 的F试剂。

Sample Input

1
4 4 4
1 0 1 1
0 0 1 1
0 0 0 0
0 0 0 0
0 0 1 1
1 0 1 1
0 0 0 0
0 0 0 0
0 0 0 0
0 0 0 0
1 0 0 0
0 0 0 0
0 0 0 0
0 0 0 0
0 0 0 0
1 0 0 0

Sample Output

3

Solution

很明显最优的方案一定是选择(1,b,c)或(a,1,c)或(a,b,1)
这样便转化为三维最小覆盖(不过没啥用)
但我们只会做二维最小覆盖(二分图),那么就考虑一维暴力,剩下的用二分图
由于\(a*b*c\leq5000\) 所以其中最小的一维一定小于17
所以最终的做法就是最小的一维\(2^{k}(k\leq17)\)暴力,记录剩下的用二分图解决

Code

//By Menteur_Hxy
#include <vector>
#include <cstdio>
#include <cstring>
#include <cstdlib>
#include <iostream>
#include <algorithm>
#define F(i,a,b) for(register int i=(a);i<=(b);i++)
using namespace std;
typedef long long LL;LL read() {LL x=0,f=1; char c=getchar();while(!isdigit(c)) {if(c=='-')f=-f;c=getchar();}while(isdigit(c)) x=(x<<1)+(x<<3)+c-48,c=getchar();return x*f;
}const int N=5010,INF=0x3f3f3f3f;
bool vis[N];
int a,b,c,fla,ans,tot;
int bx[N],by[N],bz[N],map[N][N],mat[N];
vector <int> vx[N];inline void add(int x,int y,int z) {if(fla==2) swap(x,y);else if(fla==3) swap(x,z);bx[++tot]=x,by[tot]=y,bz[tot]=z;//bx其实没用233vx[x].push_back(tot);
} bool dfs2(int u) {F(v,1,c) if(map[u][v]&&!vis[v]) {vis[v]=1;if(!mat[v] || dfs2(mat[v])) {mat[v]=u;return 1;}}return 0;
}void dfs1(int pos,int used) {if(pos==a+1) {int res=used;memset(mat,0,sizeof(mat));F(i,1,b) {memset(vis,0,sizeof(vis));if(dfs2(i)) res++;}ans=min(ans,res);return ;}dfs1(pos+1,used+1);int siz=vx[pos].size();F(i,0,siz-1) {int now=vx[pos][i];map[by[now]][bz[now]]++;}dfs1(pos+1,used);F(i,0,siz-1) {int now=vx[pos][i];map[by[now]][bz[now]]--;}
}int main() {int cas=read();while(cas--) {tot=0; ans=INF;a=read(),b=read(),c=read();if(a<=b&&a<=c) fla=1;else if(b<=a&&b<=c) fla=2;else fla=3;F(i,1,a) F(j,1,b) F(k,1,c) if(read()) add(i,j,k);if(fla==2) swap(a,b);else if(fla==3) swap(a,c);dfs1(1,0);printf("%d\n",ans);F(i,1,a) vx[i].clear();}return 0;
} 

转载于:https://www.cnblogs.com/Menteur-Hxy/p/9505412.html

[luogu3231 HNOI2013] 消毒 (二分图最小点覆盖)相关推荐

  1. 二分图最小点覆盖构造方案+König定理证明

    原文链接 前言 博主很笨 ,如有纰漏,欢迎在评论区指出讨论. 二分图的最大匹配使用 DinicDinicDinic 算法进行实现,时间复杂度为 O(ne)O(n\sqrt{e})O(ne​),其中, ...

  2. POJ 2226 二分图最小点覆盖

    题意 传送门 POJ 2226 题解 每个泥泞地需要被至少一块横着或竖着的板子覆盖,那么预处理出不能覆盖草地的限制下,所有尽可能长的横板子与竖板子.对可覆盖同一块泥泞地的 222 块板子连边,则转化为 ...

  3. POJ - 3041 Asteroids 二分图最小点覆盖

    题目链接 二分图一个很重要的定理:看了很多大神的博客表示看不懂为什么,以后再看 最小点覆盖=最大匹配 最小点覆盖就是在二分图里边,选择一个点,将所有与该点相链接的边删去,问最小找多少个点能够把所有的边 ...

  4. hihocoder 1127 : 二分图三·二分图最小点覆盖和最大独立集

    最大独立集问题: 在图G中选取尽可能多的点,使得任意两个点之间没有连边. 结论:最大独立集的点数 = 总点数 - 二分图最大匹配 证明: 假设最大独立集的点数为|U|,二分图最大匹配的匹配数为|M|, ...

  5. hdu 1054 Strategic Game 二分图最小点覆盖

    题目链接:http://acm.hdu.edu.cn/showproblem.php?pid=1054 题意: 给出一个无向图,求最小点覆盖. 思路: 用网络流来做设立一个超级源点和一个超级汇点. 每 ...

  6. 二分图最小点覆盖König定理的简单证明

    König定理是一个二分图中很重要的定理,它的意思是,一个二分图中的最大匹配数等于这个图中的最小点覆盖数.如果你还不知道什么是最小点覆盖,我也在这里说一下:假如选了一个点就相当于覆盖了以它为端点的所有 ...

  7. 【二分图|最小点覆盖集】König定理及其证明

    转自Matrix67 二分图最大匹配的König定理及其证明 如果你看不清楚第二个字母,下面有一个大号字体版本: 二分图最大匹配的König定理及其证明 本文将是这一系列里最短的一篇,因为我只打算把K ...

  8. 图论——二分图——最小点覆盖

    最小点集覆盖 == 最大匹配 一.什么是最小点覆盖 点覆盖的概念定义: 对于图G=(V,E)中的一个点覆盖是一个集合S⊆V使得每一条边至少有一个端点在S中. 最小点覆盖:点个数最少的S集合. 这是我个 ...

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

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

最新文章

  1. ffmpeg m4a 转pcm_FFmpeg提取视频音频python将音频转文字
  2. 【Android 应用开发】 自定义组件 宽高适配方法, 手势监听器操作组件, 回调接口维护策略, 绘制方法分析 -- 基于 WheelView 组件分析自定义组件
  3. 从godaddy转出域名
  4. Mac 每次都要执行source ~/.bash_profile 配置的环境变量才生效
  5. 云栖大会 | 开源引力峰会线下参会指南
  6. fedora7 常用软件安装
  7. C语言对电脑做的事儿啊,总有那么一丝恐怖,C语言操盘电脑两例
  8. shiro中文api_Shiro
  9. Linux 文件系统IO性能优化
  10. android 人脸识别边框_Android相机预览,指定区域显示预览框,在区域内出现人脸进行人脸识别,并抓拍人脸照片存在本地,CameraX,虹软人脸识别...
  11. python学习笔记(八)传递任意数量的实参
  12. spring系统学习之控制反转 ioc
  13. 基于BP人工神经网络的手写英文字符识别
  14. 分享113个HTML艺术时尚模板,总有一款适合您
  15. 各种输入方法总结(C++)
  16. 利用OGR处理几何要素
  17. The Old Man and The Sea
  18. 正在空谈「空谈“误国”」
  19. WEB超大文件上传与下载
  20. php如何实现单点登录jira,JIRA 集成 Crowd 实现单点登录

热门文章

  1. react 拖拽连接插件_一款精美的 react 后台管理系统
  2. 【译】Jumping into Solidity —The ERC721 Standard (Part 1)
  3. anasys hpc集群_这可能是最简单的并行方案,如何基于 AWS ParallelCluster 运行 ANSYS Fluent...
  4. ros安装-Ubuntu14.04
  5. 适合打游戏的计算机内存品牌型号,玩游戏电脑内存要多大合适?不同内存容量玩游戏区别实测...
  6. adb shell 修改文件名_从零开始学Linux运维|27.Shell编程(函数与参数的传递)
  7. 2021.02.01 Visual QA论文阅读
  8. AAAI 2019 《LiveBot: Generating Live Video Comments Based on Visual and Textual Contexts》论文笔记
  9. hdu5437(2015长春网络赛A题)
  10. 求细胞数量pascal题解