题目链接

不难想到每次一定是切一片。

如果是平面,很容易想到直接做二分图匹配。对于3维的?

可以发现min(a,b,c)的最大值只有\(\sqrt[3]{n}≈17\),我们暴力枚举这一最小值代表的是否选,对于剩下的两维二分图匹配

能用匈牙利用什么网络流啊。。那么麻烦。

在匈牙利求解的过程中记得剪枝!

因为实际点数应该远不如ABC多,所以不要用memset,直接枚举。

woc卡着时过去 那些2000ms怎么过的??网上找不到快点的懒得找。

zz的我考场写的每次DFS完重建边+ISAP,成功都T掉(写的方式也很zz。。每次A*B*C枚举找点,3次讨论3个DFS)

感觉数据一点梯度没有全都5s过。。

//2120kb	9300ms
#include <cstdio>
#include <cctype>
#include <cstring>
#include <algorithm>
#define gc() getchar()
const int N=5005,M=20005; int A,B,C,Time,bit[1<<18],Enum,H[N],nxt[M],to[M],match[N],use[N]/*空间换时间,匈牙利常用套路?*/;
struct Node
{
int x,y,z;
Node() {}
Node(int x,int y,int z):x(x),y(y),z(z) {}
}node[N]; inline int read()
{
int now=0;register char c=gc();
for(;!isdigit(c);c=gc());
for(;isdigit(c);now=now*10+c-'0',c=gc());
return now;
}
inline void AddEdge(int u,int v){
to[++Enum]=v, nxt[Enum]=H[u], H[u]=Enum;
}
bool Can(int x)
{
for(int i=H[x]; i; i=nxt[i])
if(use[to[i]]!=Time)
{
use[to[i]]=Time;
if(!match[to[i]]||Can(match[to[i]]))
{
match[to[i]]=x; return 1;
}
}
return 0;
}
void Work()
{
A=read(),B=read(),C=read();
int cnt=0, f=1, lim=1<<A, Max=B;
if(B<A&&B<C) f=2,lim=1<<B,Max=A;
else if(C<A&&C<B) f=3,lim=1<<C,Max=A;
for(int v,i=1; i<=A; ++i)
for(int j=1; j<=B; ++j)
for(int k=1; k<=C; ++k)
if(v=read()){
if(f==1) node[++cnt]=Node(i,j,k);//直接交换顺序即可
else if(f==2) node[++cnt]=Node(j,i,k);
else node[++cnt]=Node(k,i,j);
}
int Ans=10000;
for(int res,s=0; s<lim; ++s)
{
Enum=0, res=bit[s];//Time并不需要清空
// memset(H,0,sizeof H), memset(match,0,sizeof match);
for(int i=1; i<=Max; ++i) H[i]=match[i]=0;//here!
for(int i=1; i<=cnt; ++i)
if(!(s&(1<<node[i].x-1))) AddEdge(node[i].y,node[i].z);
++Time;
for(int i=1; i<=Max; ++i,++Time)
if(Can(i)){
if(++res>=Ans) break;//剪枝!
}
Ans=std::min(res,Ans);
}
printf("%d\n",Ans);
} int main()
{
for(int i=1; i<(1<<17); ++i) bit[i]=bit[i>>1]+(i&1);
int T=read();
while(T--) Work();
return 0;
}

BZOJ.3140.[HNOI2013]消毒(二分图匹配 匈牙利)的更多相关文章

  1. bzoj 3140: [Hnoi2013]消毒

    3140: [Hnoi2013]消毒 Description 最近在生物实验室工作的小T遇到了大麻烦. 由于实验室最近升级的缘故,他的分格实验皿是一个长方体,其尺寸为a*b*c,a.b.c 均为正整数 ...

  2. [bzoj]1059矩阵游戏<二分图匹配*匈牙利算法>

    题目链接:http://www.lydsy.com/JudgeOnline/problem.php?id=1059 初见此题,我觉得这是水题,我认为只要每一行和每一列至少存在一个黑格就可以出现对角线, ...

  3. [HNOI2013] 消毒 - 二分图匹配

    容易发现 \(a,b,c\) 中至少有一个 \(\leq 17\) 不妨将其调剂为 \(a\),那么我们可以暴力枚举哪些 \(x\) 片片要被直接削掉,剩下的拍扁成二维情况 二维时,如果有一个格子是 ...

  4. 【刷题】BZOJ 3140 [Hnoi2013]消毒

    Description 最近在生物实验室工作的小T遇到了大麻烦. 由于实验室最近升级的缘故,他的分格实验皿是一个长方体,其尺寸为abc,a.b.c 均为正整数.为了实验的方便,它被划分为abc个单位立 ...

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

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

  6. HDU 5943 Kingdom of Obsession 【二分图匹配 匈牙利算法】 (2016年中国大学生程序设计竞赛(杭州))

    Kingdom of Obsession Time Limit: 2000/1000 MS (Java/Others)    Memory Limit: 65536/32768 K (Java/Oth ...

  7. USACO 4.2 The Perfect Stall(二分图匹配匈牙利算法)

    The Perfect StallHal Burch Farmer John completed his new barn just last week, complete with all the ...

  8. [ZJOI2009]假期的宿舍 二分图匹配匈牙利

    [ZJOI2009]假期的宿舍 二分图匹配匈牙利 一个人对应一张床,每个人对床可能不止一种选择,可以猜出是二分图匹配. 床只能由本校的学生提供,而需要床的有住校并且本校和外校两种人.最后统计二分图匹配 ...

  9. 3140:[HNOI2013]消毒 - BZOJ

    题目描述 Description 最近在生物实验室工作的小 T 遇到了大麻烦. 由于实验室最近升级的缘故,他的分格实验皿是一个长方体,其尺寸为 a*b*c,a.b.c均为正整数.为了实验的方便,它被划 ...

随机推荐

  1. CSS3动画常用demo

    1.border动画 2.闪动动画(一闪一闪亮晶晶,满天都是小星星) .blink { animation: mymove 0.8s infinite; -webkit-animation: mymo ...

  2. 【黑客免杀攻防】读书笔记8 - 软件逆向工程基础2(if-else,三目运算符)

    0x1 if-else分支 if-else分支4种状态 1.1 以常量为判断条件的简单if-else分支 C源代码: 单层if-else判断,常量为判断条件 int _tmain(int argc, ...

  3. Ajax jsonp 跨域请求实例

    跨域请求 JSONP的缺点则是:它只支持GET请求而不支持POST等其它类型的HTTP请求:它只支持跨域HTTP请求这种情况,不能解决不同域的两个页面之间如何进行JavaScript调用的问题. $. ...

  4. 创建虚拟机时,提示No valid host was found解决办法

    1.http://blog.csdn.net/yxwmzouzou/article/details/43892261 2.http://www.cnblogs.com/kevingrace/p/601 ...

  5. 用zmq的pub/sub+flask实现异步通信的研究

    zmq_client监听端代码: #coding=utf8 ## client.py import zmq import sys import time import logging import o ...

  6. oracle客户端安装

    一.引导安装并配置 1)下载客户端(两个文件) 2)选中两个压缩包解压到同一个文件夹下 3)点击setup 4)选择:创建和配置数据库桌面类选择安装目录,全局数据库名:orcl,密码admin口令管理 ...

  7. 10-关于DOM的事件操作

    一.JavaScript的组成 JavaScript基础分为三个部分: ECMAScript:JavaScript的语法标准.包括变量.表达式.运算符.函数.if语句.for语句等. DOM:文档对象 ...

  8. html中子界面与父界面相互操作或传值

    一.在使用iframe的页面,要操作这个iframe里面的DOM元素可以用: contentWindow.contentDocument(测试的时候chrom浏览器,要在服务器环境下) content ...

  9. C++ code:main参数

    main函数的参数结构为两项参数: int main(int argc,char** argv){……} main的参数由操作系统传递,所以比较特殊.两个形参名一般是采用习惯名称argc和argv,表 ...

  10. ***腾讯云直播(含微信小程序直播)研究资料汇总-原创

    这段时间抽空研究了下直播技术,综合比较了下腾讯云直播的技术和文档方面最齐全,现把一些技术资料和文档归集如下: 1.微信小程序移动直播入门导读 https://cloud.tencent.com/doc ...