luogu3231 [HNOI2013]消毒
前置技能: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]消毒的更多相关文章
- [luogu3231 HNOI2013] 消毒 (二分图最小点覆盖)
		
传送门 Description 最近在生物实验室工作的小T遇到了大麻烦. 由于实验室最近升级的缘故,他的分格实验皿是一个长方体,其尺寸为abc,a.b.c 均为正整数.为了实验的方便,它被划分为abc ...
 - [BZOJ3140][HNOI2013]消毒(二分图最小点覆盖)
		
3140: [Hnoi2013]消毒 Time Limit: 10 Sec Memory Limit: 128 MBSubmit: 1621 Solved: 676[Submit][Status] ...
 - bzoj 3140: [Hnoi2013]消毒
		
3140: [Hnoi2013]消毒 Description 最近在生物实验室工作的小T遇到了大麻烦. 由于实验室最近升级的缘故,他的分格实验皿是一个长方体,其尺寸为a*b*c,a.b.c 均为正整数 ...
 - P3231 [HNOI2013]消毒
		
P3231 [HNOI2013]消毒 二维覆盖我们已经很熟悉了 扩展到三维,枚举其中较小的一维,这里定义为$a$ 以$a$为关键字状压,$1$表示该面全选 剩下的面和二维覆盖一样二分图匹配 如果还没接 ...
 - 3140:[HNOI2013]消毒 - BZOJ
		
题目描述 Description 最近在生物实验室工作的小 T 遇到了大麻烦. 由于实验室最近升级的缘故,他的分格实验皿是一个长方体,其尺寸为 a*b*c,a.b.c均为正整数.为了实验的方便,它被划 ...
 - bzoj3140: [Hnoi2013]消毒
		
Description 最近在生物实验室工作的小T遇到了大麻烦. 由于实验室最近升级的缘故,他的分格实验皿是一个长方体,其尺寸为a*b*c,a.b.c 均为正整数.为了实验的方便,它被划分为a*b*c ...
 - 【刷题】BZOJ 3140 [Hnoi2013]消毒
		
Description 最近在生物实验室工作的小T遇到了大麻烦. 由于实验室最近升级的缘故,他的分格实验皿是一个长方体,其尺寸为abc,a.b.c 均为正整数.为了实验的方便,它被划分为abc个单位立 ...
 - BZOJ3140:[HNOI2013]消毒——题解
		
http://www.lydsy.com/JudgeOnline/problem.php?id=3140 https://www.luogu.org/problemnew/show/P3231 最近在 ...
 - bzoj3140: [Hnoi2013]消毒(二分图)
		
题目描述 最近在生物实验室工作的小T遇到了大麻烦. 由于实验室最近升级的缘故,他的分格实验皿是一个长方体,其尺寸为a*b*c,a.b.c 均为正整数.为了实验的方便,它被划分为a*b*c个单位立方体区 ...
 
随机推荐
- On the way to the park Gym - 101147I   几何
			
http://codeforces.com/gym/101147/problem/I I. On the way to the park time limit per test 5 seconds m ...
 - HackerRank  Super Six Substrings   dp
			
https://www.hackerrank.com/contests/hourrank-18/challenges/super-six-substrings 能被6整除的数有一个特点,就是能同时被3 ...
 - ZooKeeper理论知识
			
前言 相信大家对 ZooKeeper 应该不算陌生.但是你真的了解 ZooKeeper 是个什么东西吗?如果别人/面试官让你给他讲讲 ZooKeeper 是个什么东西,你能回答到什么地步呢? 我本人曾 ...
 - sql 函数 coalesce
			
SQL函数 coalesce 功能: 返回参数中第一个非null的值. 语法: coalesce(参数1,参数2,参数3,...);返回第一个非null的值. 一般情况下会与Nullif()函数一起使 ...
 - Git和SVN的5个基本区别
			
如果你在读这篇文章,说明你跟大多数开发者一样对GIT感兴趣,如果你还没有机会来试一试GIT,我想现在你就要了解它了. GIT不仅仅是个版本控制系统,它也是个内容管理系统(CMS),工作管理系统等.如果 ...
 - 洛谷 P2483 [SDOI2010]魔法猪学院
			
题目描述 iPig在假期来到了传说中的魔法猪学院,开始为期两个月的魔法猪训练.经过了一周理论知识和一周基本魔法的学习之后,iPig对猪世界的世界本原有了很多的了解:众所周知,世界是由元素构成的:元素与 ...
 - js 双向绑定
			
//双向绑定实例 <input name="" ng-bind-123="name" /> function DataBinder( object_ ...
 - js生成txt文件
			
HTML CODE: <div class="modal-footer"> <a onfocus="this.blur();" id=&quo ...
 - C#反射调用小DEMO
			
程序集的源代码: namespace DesignMode { class IOCTest { public void TestO() { Console.WriteLine("O方法&qu ...
 - 单调栈3_水到极致的题 HDOJ4252
			
A Famous City 题目大意 给出正视图 每一列为楼的高度 最少有几座楼 坑点 楼高度可以为0 代表没有楼 贡献了两发RE 原因 if(!s.empty()&&tem){s. ...