Description

给定一个01矩阵,其中你可以在0的位置放置攻击装置。每一个攻击装置(x,y)都可以按照“日”字攻击其周围的 8个位置(x-1,y-2),(x-2,y-1),(x+1,y-2),(x+2,y-1),(x-1,y+2),(x-2,y+1), (x+1,y+2),(x+2,y+1)
求在装置互不攻击的情况下,最多可以放置多少个装置。

Input

第一行一个整数N,表示矩阵大小为N*N。接下来N行每一行一个长度N的01串,表示矩阵。

Output

一个整数,表示在装置互不攻击的情况下最多可以放置多少个装置。

Sample Input

3
010
000
100

Sample Output

4

HINT

100%数据 N<=200

Solution

数组咋又双叒叕开小了……不过竟然还有90 数据良心(划掉)
第一眼读完题:这咋和炮兵阵地这么像,状压没跑了!
为了验证点击题解:网络流
emmm……我好像傻了这不就是骑士共存么= =……
裸的二分图最大独立集啊QAQ

Code

  1. #include<iostream>
  2. #include<cstdio>
  3. #include<cstdlib>
  4. #include<cstring>
  5. #include<queue>
  6. #define M (1000000+10)
  7. #define N (40000+10)
  8. #define id(x,y) (x-1)*n+y
  9. using namespace std;
  10. struct node
  11. {
  12. int Flow;
  13. int next;
  14. int to;
  15. } edge[M*];
  16. int Depth[N];
  17. int head[N],num_edge,cnt;
  18. int n,m,s,e,x,y,INF,a[][],color[][];
  19. int dx[]= {,-,-,+,+,-,-,+,+};
  20. int dy[]= {,-,-,-,-,+,+,+,+};
  21. char st[N];
  22. queue<int>q;
  23.  
  24. void add(int u,int v,int l)
  25. {
  26. edge[++num_edge].to=v;
  27. edge[num_edge].Flow=l;
  28. edge[num_edge].next=head[u];
  29. head[u]=num_edge;
  30. }
  31.  
  32. bool Bfs(int s,int e)
  33. {
  34. memset(Depth,,sizeof(Depth));
  35. q.push(s);
  36. Depth[s]=;
  37. while (!q.empty())
  38. {
  39. int x=q.front();
  40. q.pop();
  41. for (int i=head[x]; i!=; i=edge[i].next)
  42. if (!Depth[edge[i].to] && edge[i].Flow>)
  43. {
  44. Depth[edge[i].to]=Depth[x]+;
  45. q.push(edge[i].to);
  46. }
  47. }
  48. return Depth[e];
  49. }
  50.  
  51. int Dfs(int x,int low)
  52. {
  53. int Min,f=;
  54. if (x==e || low==)
  55. return low;
  56. for (int i=head[x]; i!=; i=edge[i].next)
  57. if (edge[i].Flow> && Depth[edge[i].to]==Depth[x]+ && (Min=Dfs(edge[i].to,min(low,edge[i].Flow))))
  58. {
  59. edge[i].Flow-=Min;
  60. edge[((i-)^)+].Flow+=Min;
  61. low-=Min;
  62. f+=Min;
  63. if (low==) return f;
  64. }
  65. if (!f) Depth[x]=-;
  66. return f;
  67. }
  68.  
  69. int Dinic(int s,int e)
  70. {
  71. int Ans=;
  72. while (Bfs(s,e))
  73. Ans+=Dfs(s,0x7fffffff);
  74. return Ans;
  75. }
  76.  
  77. int main()
  78. {
  79. scanf("%d",&n);
  80. s=,e=*+;
  81. for (int i=; i<=n; ++i)
  82. {
  83. scanf("%s",st);
  84. for (int j=; j<=n; ++j)
  85. {
  86. a[i][j]=st[j-]-'';
  87. color[i][j]=(i+j)%;
  88. if (a[i][j]==) continue;
  89. cnt++;
  90. if (color[i][j]==) add(s,id(i,j),), add(id(i,j),s,);
  91. else add(id(i,j),e,), add(e,id(i,j),);
  92. }
  93. }
  94. for (int i=; i<=n; ++i)
  95. for (int j=; j<=n; ++j)
  96. {
  97. if (a[i][j]== || color[i][j]==) continue;
  98. for (int k=; k<=; ++k)
  99. {
  100. int x=i+dx[k],y=j+dy[k];
  101. if (x< || x>n || y< || y>n || a[x][y]==) continue;
  102. add(id(i,j),id(x,y),);
  103. add(id(x,y),id(i,j),);
  104. }
  105. }
  106. printf("%d",cnt-Dinic(s,e));
  107. }

BZOJ3175:[TJOI2013]攻击装置(二分图最大独立集)的更多相关文章

  1. BZOJ3175[Tjoi2013]攻击装置——二分图最大独立集

    题目描述 给定一个01矩阵,其中你可以在0的位置放置攻击装置.每一个攻击装置(x,y)都可以按照“日”字攻击其周围的 8个位置(x-1,y-2),(x-2,y-1),(x+1,y-2),(x+2,y- ...

  2. bzoj4808: 马 & bzoj3175: [Tjoi2013]攻击装置 (黑白染色+最小割)

    bzoj4808: 马 & bzoj3175: [Tjoi2013]攻击装置 题目:传送门 简要题意: 和n皇后问题差不多,但是这里是每个棋子走日子,而且有些格子不能放棋子.求最多能放多少个棋 ...

  3. BZOJ3175: [Tjoi2013]攻击装置

    题解: 最大点独立集...好像水过头了... 不过发现我二分图好像忘完了!!! 代码: #include<cstdio> #include<cstdlib> #include& ...

  4. 【BZOJ 3175】 3175: [Tjoi2013]攻击装置(二分图匹配)

    3175: [Tjoi2013]攻击装置 Description 给定一个01矩阵,其中你可以在0的位置放置攻击装置.每一个攻击装置(x,y)都可以按照“日”字攻击其周围的 8个位置(x-1,y-2) ...

  5. BZOJ3175 Tjoi2013 攻击装置(二分图匹配)

    传送门 Description 给定一个01矩阵,其中你可以在0的位置放置攻击装置.每一个攻击装置(x,y)都可以按照"日"字攻击其周围的 8个位置(x-1,y-2),(x-2,y ...

  6. [TJOI2013] 攻击装置 - 二分图匹配

    给定 \(N \times N\) 棋盘,某些格子是障碍,问可以放置的互不侵犯的马的个数 黑白染色后建立二分图,求最大独立集 = 总点数 - 最大匹配数 注意把反边也连上会WA掉(脑抽一发血) #in ...

  7. bzoj3175: [Tjoi2013]攻击装置&&4808: 马

    终于知道为啥网络流这么受欢迎了. 其实就是构个图模板一下的事儿,比较好打是吧. 然后这题网络流黑白染色(其实感觉上匈牙利更加直接好想啊,但是实际上黑白染色给人感觉就是二分图) st连白而ed连黑,流量 ...

  8. BZOJ_3175_[Tjoi2013]攻击装置_二分图匹配

    BZOJ_3175_[Tjoi2013]攻击装置_二分图匹配Description 给定一个01矩阵,其中你可以在0的位置放置攻击装置.每一个攻击装置(x,y)都可以按照“日”字攻击其周围的 8个位置 ...

  9. 【洛谷】4304:[TJOI2013]攻击装置【最大点独立集】【二分图】2172: [国家集训队]部落战争【二分图/网络流】【最小路径覆盖】

    P4304 [TJOI2013]攻击装置 题目描述 给定一个01矩阵,其中你可以在0的位置放置攻击装置. 每一个攻击装置(x,y)都可以按照“日”字攻击其周围的8个位置(x-1,y-2),(x-2,y ...

随机推荐

  1. DataSet常用简单方法

    Clear移除表中所有行来清除任何数据的DataSet Clone赋值该DataSet的结构但不复制数据 Copy赋值DataSet的结构和数据 Dispose释放DataSet对象 Equals确定 ...

  2. C# 日历类

    using System; namespace DotNet.Utilities { /// <summary> /// 农历属性 /// </summary> public ...

  3. 15、IO (转换流、缓冲流)

    转换流概述 * A: 转换流概述 * a: 转换流概述 * OutputStreamWriter 是字符流通向字节流的桥梁:可使用指定的字符编码表,将要写入流中的字符编码成字节 * 将字符串按照指定的 ...

  4. 1、类、封装(私有private、this关键字)

    类与对象 对象在需求中的使用 ​ 对面向对象有了了解之后,我们来说说在具体问题中如何使用面向对象去分析问题,和如何使用面向对象. ​ 我们把大象装冰箱为例进行分析. ​ 在针对具体的需求,可以使用名词 ...

  5. 前端(十二):react-redux实现逻辑

    一.context实现数据传递 在react中,props和state都可以设置数据.不同的是,props借助组件属性传递数据但不可以渲染组件,它相对来说是“静态的”:state可以监听事件来修改数据 ...

  6. HDFS学习

    HDFS体系结构 HDFS采用了主从(Master/Slave)结构模型,一个HDFS集群包括一个名称节点(NameNode)和若干个数据节点(DataNode)(如图所示).名称节点作为中心服务器, ...

  7. BZOJ2987:Earthquake(类欧几里德算法)

    Sol 设 \(n=\lfloor\frac{c}{a}\rfloor\) 问题转化为求 \[\sum_{i=0}^{n}\lfloor\frac{c-ax}{b}\rfloor+1=\sum_{i= ...

  8. [JSOI2008]最大数 线段树解法

    题目描述 现在请求你维护一个数列,要求提供以下两种操作: 1. 查询操作. 语法:Q L 功能:查询当前数列中末尾L个数中的最大的数,并输出这个数的值. 限制:L不超过当前数列的长度. 2. 插入操作 ...

  9. 理解webpack4.splitChunks之maxInitialRequests

    maxInitialRequests是splitChunks里面比较难以理解的点之一,它表示允许入口并行加载的最大请求数,之所以有这个配置也是为了对拆分数量进行限制,不至于拆分出太多模块导致请求数量过 ...

  10. jQuery轮播图(一)轮播实现并封装

    利用面向对象自己动手写了一个封装好的jquery轮播组件,可满足一般需求,不仅使用简单且复用性高. demo:点此预览 代码地址:https://github.com/zsqosos/componen ...