传送门

考虑贪心,控制某一维为1,另两位最大是最优的,也就是一次选一个厚度为1的面

那么对于每个点,可以有3种面是可以选到它的

然后gg

考虑二维的状态,一个平面,有些点,一次选一行或一列最优

那么每一个点i,j可以被行i和列j选中,将i->j连接一条边,每一条边就代表一个点

选取最少的点覆盖所有边就是最少点覆盖=最大匹配

因为a*b*c<=5000所以最小的那一维一定<=17,可以枚举这一维哪些面被一次清除,

#include <cstdio>
#include <cstring>
#include <iostream>
#define N 5001 using namespace std; int T, a, b, c, n, ans, cnt;
int now[N][N], head[N], to[N * N], nex[N * N], belong[N];
bool vis[N]; struct node
{
int x, y, z;
node(int x = 0, int y = 0, int z = 0) : x(x), y(y), z(z) {}
}p[N]; inline int read()
{
int x = 0, f = 1;
char ch = getchar();
for(; !isdigit(ch); ch = getchar()) if(ch == '-') f = -1;
for(; isdigit(ch); ch = getchar()) x = (x << 1) + (x << 3) + ch - '0';
return x * f;
} inline void clear()
{
int i;
ans = cnt = 0;
for(i = 1; i <= b; i++) head[i] = -1;
for(i = 1; i <= c; i++) belong[i] = 0;
} inline void add(int x, int y)
{
to[cnt] = y;
nex[cnt] = head[x];
head[x] = cnt++;
} inline bool dfs(int u)
{
int i, v;
for(i = head[u]; ~i; i = nex[i])
{
v = to[i];
if(!vis[v])
{
vis[v] = 1;
if(!belong[v] || dfs(belong[v]))
{
belong[v] = u;
return 1;
}
}
}
return 0;
} inline int solve()
{
int i, j, k, ret = 1e9;
for(k = 0; k < (1 << a); k++)
{
clear();
for(i = k; i; i >>= 1)
if(i & 1) ans++;
for(i = 1; i <= n; i++)
if(!(k & (1 << p[i].x - 1))) now[p[i].y][p[i].z] = 1;
for(i = 1; i <= b; i++)
for(j = 1; j <= c; j++)
if(now[i][j]) add(i, j);
for(i = 1; i <= b; i++)
{
for(j = 1; j <= c; j++) vis[j] = 0;
ans += dfs(i);
}
ret = min(ret, ans);
for(i = 1; i <= n; i++)
if(!(k & (1 << p[i].x - 1))) now[p[i].y][p[i].z] = 0;
}
return ret;
} int main()
{
int i, j, k, x;
T = read();
while(T--)
{
n = 0;
a = read();
b = read();
c = read();
for(i = 1; i <= a; i++)
for(j = 1; j <= b; j++)
for(k = 1; k <= c; k++)
{
x = read();
if(x) p[++n] = node(i, j, k);
}
if(c < a && c < b)
{
swap(a, c);
for(i = 1; i <= n; i++) swap(p[i].x, p[i].z);
}
else if(b < c && b < a)
{
swap(a, b);
for(i = 1; i <= n; i++) swap(p[i].x, p[i].y);
}
printf("%d\n", solve());
}
return 0;
}

  

剩余的面压缩到一起,连边跑匈牙利

[luoguP3231] [HNOI2013]消毒(最小点覆盖 + 状压)的更多相关文章

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

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

  2. POJ 2404 Jogging Trails [DP 状压 一般图最小权完美匹配]

    传送门 题意:找一个经过所有边权值最小的回路,$n \le 15$ 所有点度数为偶则存在欧拉回路,直接输出权值和 否则考虑度数为奇的点,连着奇数条边,奇点之间走已经走过的路移动再走没走过的路 然后大体 ...

  3. 最小总代价 状压DP

    描述 n个人在做传递物品的游戏,编号为1-n. 游戏规则是这样的:开始时物品可以在任意一人手上,他可把物品传递给其他人中的任意一位:下一个人可以传递给未接过物品的任意一人. 即物品只能经过同一个人一次 ...

  4. Vijos 1456 最小总代价 (状压dp)

    看到这道题n只有16,就可以想到状压dp 每个人只有经过或者没经过,那就用1表示经过,0表示没经过 但是不是当前在谁那里,所以再加一维来记录 所以f[state][i]表示在物品在i,当前的状态是st ...

  5. HDU 1565 - 方格取数(1) - [状压DP][网络流 - 最大点权独立集和最小点权覆盖集]

    题目链接:https://cn.vjudge.net/problem/HDU-1565 Time Limit: 10000/5000 MS (Java/Others) Memory Limit: 32 ...

  6. P3231 [HNOI2013]消毒

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

  7. bzoj3380: [Usaco2004 Open]Cave Cows 1 洞穴里的牛之一(spfa+状压DP)

    数据最多14个有宝藏的地方,所以可以想到用状压dp 可以先预处理出每个i到j的路径中最小权值的最大值dis[i][j] 本来想用Floyd写,无奈太弱调不出来..后来改用spfa 然后进行dp,这基本 ...

  8. HDU 1074 Doing Homework (状压dp)

    题意:给你N(<=15)个作业,每个作业有最晚提交时间与需要做的时间,每次只能做一个作业,每个作业超出最晚提交时间一天扣一分 求出扣的最小分数,并输出做作业的顺序.如果有多个最小分数一样的话,则 ...

  9. CF453B Little Pony and Harmony Chest (状压DP)

    CF453B CF454D Codeforces Round #259 (Div. 2) D Codeforces Round #259 (Div. 1) B D. Little Pony and H ...

随机推荐

  1. CF Gym 100463B Music Mess (思路)

    好题,当时想了半个小时,我往图论方面去想了,把出现过的字符串当场点,然后相互连边,那么就构成了一个三角形,一个大于三个点的连通分量里有以下结论:度为二的点可能是track,度为大于二的点一定不是tra ...

  2. Android(java)学习笔记134:Android数据存储5种方式总结

    1.使用文件(File)存储 存储一般的数据 2.使用sharedperference(xml) 存储设置信息.配置信息.密码 3.数据库Sqlite 开源的,嵌入式的数据库,轻量级 4.使用Cont ...

  3. python - 日期处理模块

    首先就是模块的调用,很多IDE都已经安装好了很多Python经常使用到的模块,所以我们暂时不需要安装模块了. ? 1 2 3 import datetime import time import ca ...

  4. Unity学习之路——C#相关

    1.C#数组数组定义 int[] number; float[] score; string[] names;动态初始化,借助new运算符为数组元素分配空间int[] Array = new int[ ...

  5. 【上下界网络流 费用流】bzoj2055: 80人环游世界

    EK费用流居然写错了…… Description     想必大家都看过成龙大哥的<80天环游世界>,里面的紧张刺激的打斗场面一定给你留下了深刻的印象.现在就有这么     一个80人的团 ...

  6. RSA与AES实现数据加密传输

    RSA.AES简介 RSA:非对称加密,需要提前生成两个密钥(一对的),通过其中一个密钥加密后的数据,只有另一个密钥能解密.通常这两个密钥中有一个会暴漏出来,即对外公开的,这个密钥称为“公钥”,反之另 ...

  7. DeepFaceLab小白入门(6):脸部替换以及合成视频!

    前面的都是准备工作,这个环节才是真的换脸.换脸主要分两部分,1,图片换脸,2,把图片合成视频. 7) convert H64 debug.bat 这个环节是和训练环节相对于的,比如我们之前选的是H64 ...

  8. 【laravel】【转发】laravel 导入导出excel文档

    1.简介 Laravel Excel 在 Laravel 5 中集成 PHPOffice 套件中的 PHPExcel ,从而方便我们以优雅的.富有表现力的代码实现Excel/CSV文件的导入和 导出  ...

  9. 9-11.Yii2.0框架控制器分配视图并传参xss攻击脚本视图的过滤

    目录 一维数组传参 新建控制器: 新建view模板 二维数组传参 新建控制器: 新建view模板 视图非法字符的过滤 新建控制器: 新建view模板 一维数组传参 新建控制器: D:\xampp\ht ...

  10. 数字pid笔记(1)

    针对stm32中可以如下实现: p->IncrementVal = (p->Kp * (p->err - p->err_next)) + (p->Ki * p->e ...