题目链接

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

如果是平面,很容易想到直接做二分图匹配。对于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过。。

  1. //2120kb 9300ms
  2. #include <cstdio>
  3. #include <cctype>
  4. #include <cstring>
  5. #include <algorithm>
  6. #define gc() getchar()
  7. const int N=5005,M=20005;
  8. int A,B,C,Time,bit[1<<18],Enum,H[N],nxt[M],to[M],match[N],use[N]/*空间换时间,匈牙利常用套路?*/;
  9. struct Node
  10. {
  11. int x,y,z;
  12. Node() {}
  13. Node(int x,int y,int z):x(x),y(y),z(z) {}
  14. }node[N];
  15. inline int read()
  16. {
  17. int now=0;register char c=gc();
  18. for(;!isdigit(c);c=gc());
  19. for(;isdigit(c);now=now*10+c-'0',c=gc());
  20. return now;
  21. }
  22. inline void AddEdge(int u,int v){
  23. to[++Enum]=v, nxt[Enum]=H[u], H[u]=Enum;
  24. }
  25. bool Can(int x)
  26. {
  27. for(int i=H[x]; i; i=nxt[i])
  28. if(use[to[i]]!=Time)
  29. {
  30. use[to[i]]=Time;
  31. if(!match[to[i]]||Can(match[to[i]]))
  32. {
  33. match[to[i]]=x; return 1;
  34. }
  35. }
  36. return 0;
  37. }
  38. void Work()
  39. {
  40. A=read(),B=read(),C=read();
  41. int cnt=0, f=1, lim=1<<A, Max=B;
  42. if(B<A&&B<C) f=2,lim=1<<B,Max=A;
  43. else if(C<A&&C<B) f=3,lim=1<<C,Max=A;
  44. for(int v,i=1; i<=A; ++i)
  45. for(int j=1; j<=B; ++j)
  46. for(int k=1; k<=C; ++k)
  47. if(v=read()){
  48. if(f==1) node[++cnt]=Node(i,j,k);//直接交换顺序即可
  49. else if(f==2) node[++cnt]=Node(j,i,k);
  50. else node[++cnt]=Node(k,i,j);
  51. }
  52. int Ans=10000;
  53. for(int res,s=0; s<lim; ++s)
  54. {
  55. Enum=0, res=bit[s];//Time并不需要清空
  56. // memset(H,0,sizeof H), memset(match,0,sizeof match);
  57. for(int i=1; i<=Max; ++i) H[i]=match[i]=0;//here!
  58. for(int i=1; i<=cnt; ++i)
  59. if(!(s&(1<<node[i].x-1))) AddEdge(node[i].y,node[i].z);
  60. ++Time;
  61. for(int i=1; i<=Max; ++i,++Time)
  62. if(Can(i)){
  63. if(++res>=Ans) break;//剪枝!
  64. }
  65. Ans=std::min(res,Ans);
  66. }
  67. printf("%d\n",Ans);
  68. }
  69. int main()
  70. {
  71. for(int i=1; i<(1<<17); ++i) bit[i]=bit[i>>1]+(i&1);
  72. int T=read();
  73. while(T--) Work();
  74. return 0;
  75. }

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. BIM 相关资料

    BIM 相关资料:http://pan.baidu.com/share/link?shareid=919219072&uk=966240844

  2. Jenkins与网站代码上线解决方案【转】

    转自 Jenkins与网站代码上线解决方案 - 惨绿少年 https://www.nmtui.com/clsn/lx524.html 1.1 前言 Jenkins是一个用Java编写的开源的持续集成工 ...

  3. VC++常用数据类型

    原文地址:https://www.cnblogs.com/yincheng01/archive/2008/12/31/2213386.html 一.              VC常用数据类型列表 二 ...

  4. mybatis主键自增长

    在数据库中建序列:SEQ_T_RESOURCE 第一种:会在传入该方法的的参数集合中添加主键元素,相当于:map.put("RES_ID",xxx); <insert id= ...

  5. VS2017项目程序打包成.msi或者.exe

    VS2017项目程序打包成.msi或者.exe 1.安装打包插件:Microsoft Visual Studio 2017 Installer Projects 打开vs2017 ,选择 工具 --& ...

  6. 【ES】学习8-聚合1

    参考资料: https://elasticsearch.cn/book/elasticsearch_definitive_guide_2.x/_combining_the_two.html 特定概念: ...

  7. 欧拉函数,打表求欧拉函数poj3090

    欧拉函数 φ(n) 定义:[1,N]中与N互质的数的个数 //互质与欧拉函数 /* 求欧拉函数 按欧拉函数计算公式,只要分解质因数即可 */ int phi(int n){ int ans=n; ;i ...

  8. Gym100340 线性dp

    //看题解写的 https://blog.csdn.net/sdfzyhx/article/details/51804748#include<bits/stdc++.h> using na ...

  9. Grafana 监控系统是否重启

    一.概述 Linux 内核(以下简称内核)是一个不与特定进程相关的功能集合,内核的代码很难轻易的在调试器中执行和跟踪.开发者认为,内核如果发生了错误,就不应该继续运 行.因此内核发生错误时,它的行为通 ...

  10. JDBC事务,银行转账,货物进出库等等。

    1:转账业务 转账必须执行2个sql语句(update更新)都成功的情况下,提交事务,如果有一个失败,则2个都回滚事务2:事务应该具有4个属性:原子性.一致性.隔离性.持久性.这四个属性通常称为ACI ...