Solution -「HNOI2013」消毒
弱化一下,先考虑在二维上解决问题。
题目就转化为:有 \(n\) 个点 \((i, j)\) 需要被覆盖,而我们每次可以选一行或一列去覆盖,求覆盖所有点的最少选择次数。
如果我们对于每一个 \((i, j)\),我们把第 \(i\) 行和第 \(j\) 列连边,显然能构成一张二分图。
图中每一条边就是一个需求,而每选择一个点就能解决掉所有与之相连的需求,答案就是解决所有需求最少需要选择的点数。这就是二分图上的最小点覆盖问题。
答案即为最大匹配数。
现在加入三维。因为 \(a, b, c \leq 5 \times 10 ^ 3\),所以 \(\min \{ a, b, c \} \leq 13\)。
那么我们可以考虑用最多 \(2^{13}\) 的时间去枚举其中一维的选择,即枚举这一维上我们选择哪几条基准线先直接覆盖。
那么剩下的就是之前的二维做法了。注意每次枚举的时候应该枚举最小的那一位,这样才能保证复杂度。
二分图最大匹配使用匈牙利算法,在接近完全图的图中性能相比于 Dinic 会较好。
#include <cstdio>
int Abs(int x) { return x < 0 ? -x : x; }
int Max(int x, int y) { return x > y ? x : y; }
int Min(int x, int y) { return x < y ? x : y; }
int read() {
int x = 0, k = 1;
char s = getchar();
while(s < '0' || s > '9') {
if(s == '-')
k = -1;
s = getchar();
}
while('0' <= s && s <= '9') {
x = (x << 3) + (x << 1) + (s ^ 48);
s = getchar();
}
return x * k;
}
void write(int x) {
if(x < 0) {
x = -x;
putchar('-');
}
if(x > 9)
write(x / 10);
putchar(x % 10 + '0');
}
void print(int x, char s) {
write(x);
putchar(s);
}
const int MAXN = 5e3 + 5;
const int MAXM = 2e5 + 5;
const int MAXL = 5e3 + 5;
const int INF = 2147483647;
struct edge {
int v, w, nxt;
edge() {}
edge(int V, int W, int Nxt) {
v = V, w = W, nxt = Nxt;
}
} e[MAXM << 1];
int head[MAXN], n, m, cnt;
void Add_Edge(int u, int v, int w) {
e[cnt] = edge(v, w, head[u]);
head[u] = cnt++;
}
bool Chose[MAXM << 1];
int Mat[MAXN], Tim[MAXN], tot;
void init(int N, int M) {
for(int i = 0; i <= cnt; i++)
Chose[i] = false;
n = N, m = M;
for(int i = 1; i <= n; i++)
head[i] = -1, Tim[i] = 0, Mat[i] = 0;
cnt = 0, tot = 0;
}
bool dfs(int u) {
if (Tim[u] == tot)
return false;
Tim[u] = tot;
for (int i = head[u], v; ~i; i = e[i].nxt) {
if(Chose[e[i].w])
continue;
v = e[i].v;
if (!Mat[v] || dfs(Mat[v])) {
Mat[v] = u;
return true;
}
}
return false;
}
int calc() {
int ans = 0;
for (int i = 1; i <= m; i++)
Mat[i] = 0;
for (int i = 1; i <= n; i++)
Tim[i] = 0;
for (int i = n; i >= 1; i--) {
tot++;
ans += dfs(i);
}
return ans;
}
bool vis[MAXN];
int q[MAXN], pos[5], len = 0, ans = INF, tot2 = 0, S, T;
void dfs2(int p) {
if(p > pos[1]) {
ans = Min(ans, calc() + tot2);
return ;
}
Chose[p] = true;
tot2++;
dfs2(p + 1);
Chose[p] = false;
tot2--;
dfs2(p + 1);
}
int main() {
int t = read();
while(t--) {
for(int i = 1; i <= 3; i++)
pos[i] = read();
if(pos[1] > pos[2])
pos[1] ^= pos[2] ^= pos[1] ^= pos[2];
if(pos[2] > pos[3])
pos[2] ^= pos[3] ^= pos[2] ^= pos[3];
if(pos[1] > pos[2])
pos[1] ^= pos[2] ^= pos[1] ^= pos[2];
init(pos[2], pos[3]);
len = 0, ans = INF, tot = 0;
for(int i = 1, j, k, p; i <= pos[1]; i++)
for(j = 1; j <= pos[2]; j++)
for(k = 1; k <= pos[3]; k++) {
p = (i - 1) * pos[2] * pos[3] + (j - 1) * pos[3] + k;
q[p] = read();
if(q[p])
Add_Edge(j, k, i);
}
dfs2(1);
print(ans, '\n');
}
return 0;
}
Solution -「HNOI2013」消毒的更多相关文章
- 「HNOI2013」游走
「HNOI2013」游走 题目描述 一个无向连通图,顶点从 \(1\) 编号到 \(N\) ,边从 \(1\) 编号到 \(M\) .小 \(Z\) 在该图上进行随机游走,初始时小 \(Z\) 在 \ ...
- 「题解」「HNOI2013」切糕
文章目录 「题解」「HNOI2013」切糕 题目描述 思路分析及代码 题目分析 题解及代码 「题解」「HNOI2013」切糕 题目描述 点这里 思路分析及代码 题目分析 这道题的题目可以说得上是史上最 ...
- Solution -「构造」专练
记录全思路过程和正解分析.全思路过程很 navie,不过很下饭不是嘛.会持续更新的(应该). 「CF1521E」Nastia and a Beautiful Matrix Thought. 要把所有数 ...
- Solution -「原创」Destiny
题目背景 题目背景与题目描述无关.签到愉快. 「冷」 他半靠在床沿,一缕感伤在透亮的眼眸间荡漾. 冷见惆怅而四散逃去.经历嘈杂喧嚣,感官早已麻木.冷又见空洞而乘隙而入.从里向外,这不是感官的范畴. 他 ...
- Solution -「GLR-R2」教材运送
\(\mathcal{Description}\) Link. 给定一棵包含 \(n\) 个点,有点权和边权的树.设当前位置 \(s\)(初始时 \(s=1\)),每次在 \(n\) 个结点内 ...
- 「HNOI2013」切糕
题目链接 戳我 \(Solution\) 对于这道题,我们首先来看看没有\(D\)这个约束的该如何做. 我们考虑构造最小割模型. 其实直接贪心就好了,选出每条路径上的最小值就好了(路径就是将每层的同一 ...
- Solution -「WF2011」「BZOJ #3963」MachineWorks
\(\mathcal{Description}\) Link. 给定你初始拥有的钱数 \(C\) 以及 \(N\) 台机器的属性,第 \(i\) 台有属性 \((d_i,p_i,r_i,g_i ...
- Solution -「LOCAL」二进制的世界
\(\mathcal{Description}\) OurOJ. 给定序列 \(\{a_n\}\) 和一个二元运算 \(\operatorname{op}\in\{\operatorname{ ...
- Solution -「SHOI2016」「洛谷 P4336」黑暗前的幻想乡
\(\mathcal{Description}\) link. 有一个 \(n\) 个结点的无向图,给定 \(n-1\) 组边集,求从每组边集选出恰一条边最终构成树的方案树.对 \(10^9+ ...
随机推荐
- Hadoop(一)Hadoop核心架构与安装
Hadoop是什么 大白话,Hadoop是个存储数据,计算数据的分布式框架.核心组件是HDFS.MapReduce.Yarn. HDFS:分布式存储 MapReduce:分布式计算 Yarn:调度Ma ...
- Linux C++ Reactor模式
文件结构 reactor_main.cpp reactor_server.cpp reactor_server.h CMakeLists.txt CMakeLists.txt cmake_minimu ...
- Apache Struts 2 漏洞汇总
Apache Struts2 是一个基于MVC设计模式的Web应用框架,会对某些标签属性(比如 id)的属性值进行二次表达式解析,因此在某些场景下将可能导致远程代码执行. Struts2特征: 通过页 ...
- 【高并发】通过源码深度解析ThreadPoolExecutor类是如何保证线程池正确运行的
大家好,我是冰河~~ 对于线程池的核心类ThreadPoolExecutor来说,有哪些重要的属性和内部类为线程池的正确运行提供重要的保障呢? ThreadPoolExecutor类中的重要属性 在T ...
- JavaScript与函数式编程
JavaScript与函数式编程 绝大多数编程语言都会有函数的概念(或者说所有的?我不太确定),他们都可以做出类似的操作: function(x) { return x * x } 但是Javascr ...
- 服务器上详细前后端分离项目搭建(springboot+vue)
介绍:本文用的经典的前后端分离开源项目ruoyi Gitee链接地址:https://gitee.com/y_project/RuoYi 一.拉取项目: 利用Git把项目拉取到本地,也可以直接利用id ...
- Linux用户权限集中管理方案
一.问题 服务器多,各个服务器上的管理人员多,ROOT权限泛滥,经常导致文件莫名其妙丢失,老手和新手对服务器的熟知程度不同,安全存在不稳定和操作安全隐患. 二.方案 利用sudo配置指定用户只能执行指 ...
- ATM+购物车项目流程
目录 需求分析 架构设计 功能实现 搭建文件目录 conf配置文件夹 lib公共功能文件夹 db数据文件夹 interface业务逻辑层文件夹 core表现层文件夹 测试 最外层功能(src.py) ...
- 给小白的 PostgreSQL 容器化部署教程(上)
作者:王志斌 编辑:钟华龙 本文来自社区小伙伴 王志斌 的投稿.从小白的角度,带你一步步实现将 RadonDB PostgreSQL 集群部署到 Kubernetes 上.文章分为上下两部分,第一部分 ...
- 《C Primer Plus》第六版笔记--1~3章
目录 第一章 初识C语言 1 使用C语言的7个步骤 1.1 定义程序目标 1.2 设计程序(功能实现) 1.3 编写代码 1.4 编译 1.5 运行程序 1.6 测试和调试程序 1.7 维护和修改代码 ...