题目描述

在一个 n*n 个方格的国际象棋棋盘上,马(骑士)可以攻击的棋盘方格如图所示。棋盘上某些方格设置了障碍,骑士不得进入。

对于给定的 n*n 个方格的国际象棋棋盘和障碍标志,计算棋盘上最多可以放置多少个骑士,使得它们彼此互不攻击。

输入格式

第一行有 2 个正整数 n 和 m(1<=n<=200,0<=m<n2) (1<=n<=200, 0<=m<n^2)(1<=n<=200,0<=m<n​2​​),分别表示棋盘的大小和障碍数。接下来的 m 行给出障碍的位置。每行 2 个正整数,表示障碍的方格坐标。

输出格式

将计算出的共存骑士数输出。

样例

input

  1. 3 2
  2. 1 1
  3. 3 3

output

  1. 5
  1. //Serene
  2. #include<algorithm>
  3. #include<iostream>
  4. #include<cstring>
  5. #include<cstdlib>
  6. #include<cstdio>
  7. #include<cmath>
  8. using namespace std;
  9. const int maxn=200*200+10,maxm=4*maxn+maxn;
  10. int n,k,S,T,tot;
  11. bool pl[maxn];
  12.  
  13. int aa;char cc;
  14. int read() {
  15. aa=0;cc=getchar();
  16. while(cc<'0'||cc>'9') cc=getchar();
  17. while(cc>='0'&&cc<='9') aa=aa*10+cc-'0',cc=getchar();
  18. return aa;
  19. }
  20.  
  21. struct Node{
  22. int x,y,cap,flow;
  23. }node[2*maxm];
  24.  
  25. int cur[maxn];
  26. int fir[maxn],nxt[2*maxm],e=1;
  27. void add(int x,int y,int z) {
  28. node[++e].x=x;node[e].y=y;node[e].cap=z; nxt[e]=fir[x];fir[x]=e;
  29. node[++e].x=y;node[e].y=x;node[e].cap=0; nxt[e]=fir[y];fir[y]=e;
  30. }
  31.  
  32. int zz[maxn],dis[maxn],s=1,t=0;
  33. bool BFS() {
  34. memset(dis,-1,sizeof(dis));
  35. dis[S]=0; s=1,t=0;zz[++t]=S;
  36. int x,y;
  37. while(s<=t) {
  38. x=zz[s];s++;
  39. for(y=fir[x];y;y=nxt[y]) {
  40. if(node[y].flow>=node[y].cap||dis[node[y].y]!=-1) continue;
  41. dis[node[y].y]=dis[x]+1;
  42. zz[++t]=node[y].y;
  43. }
  44. }
  45. return dis[T]!=-1;
  46. }
  47.  
  48. int DFS(int pos,int maxf) {
  49. if(pos==T||!maxf) return maxf;
  50. int rs=0,now;
  51. for(int &y=cur[pos];y;y=nxt[y]) {
  52. if(node[y].flow>=node[y].cap||dis[node[y].y]!=dis[node[y].x]+1) continue;
  53. now=DFS(node[y].y,min(maxf,node[y].cap-node[y].flow));
  54. node[y].flow+=now;
  55. node[y^1].flow-=now;
  56. rs+=now;
  57. maxf-=now;
  58. }
  59. if(!rs) dis[pos]=-1;
  60. return rs;
  61. }
  62.  
  63. int Dinic() {
  64. int rs=0;
  65. while(BFS()) {
  66. memcpy(cur,fir,sizeof(fir));
  67. rs+=DFS(S,0x3f3f3f3f);
  68. }
  69. return rs;
  70. }
  71.  
  72. int main() {
  73. n=read();k=read();tot=n*n;
  74. int x,y; S=tot+1;T=S+1;
  75. for(int i=1;i<=k;++i) {
  76. x=read();y=read();
  77. tot--;
  78. pl[(x-1)*n+y]=1;
  79. }
  80. for(int i=1;i<=n;++i) for(int j=1;j<=n;++j) {
  81. x=(i-1)*n+j;
  82. if(pl[x]) continue;
  83. if((i+j)%2==0) add(S,x,1); else add(x,T,1);
  84. for(int r=1;r<=2;++r) {
  85. if(i>r) {
  86. int rr=3-r;
  87. if(j>rr) {
  88. y=x-r*n-rr;
  89. if(!pl[y]) {
  90. if((i+j)%2==0) add(x,y,1); else add(y,x,1);
  91. }
  92. }
  93. if(j<=n-rr) {
  94. y=x-r*n+rr;
  95. if(!pl[y]) {
  96. if((i+j)%2==0) add(x,y,1); else add(y,x,1);
  97. }
  98. }
  99. }
  100. }
  101. }
  102. printf("%d",tot-Dinic());
  103. return 0;
  104. }

  

网络流24题 骑士共存(DCOJ8023)的更多相关文章

  1. AC日记——[网络流24题]骑士共存 cogs 746

    746. [网络流24题] 骑士共存 ★★☆   输入文件:knight.in   输出文件:knight.out   简单对比时间限制:1 s   内存限制:128 MB 骑士共存问题 «问题描述: ...

  2. Cogs 746. [网络流24题] 骑士共存(最大独立集)

    [网络流24题] 骑士共存 ★★☆ 输入文件:knight.in 输出文件:knight.out 简单对比 时间限制:1 s 内存限制:128 MB 骑士共存问题 «问题描述: 在一个n*n个方格的国 ...

  3. COGS746. [网络流24题] 骑士共存

    骑士共存问题«问题描述:在一个n*n个方格的国际象棋棋盘上,马(骑士)可以攻击的棋盘方格如图所示.棋盘 上某些方格设置了障碍,骑士不得进入. «编程任务:对于给定的n*n个方格的国际象棋棋盘和障碍标志 ...

  4. [网络流24题] 骑士共存(cogs 746)

    骑士共存问题«问题描述:在一个n*n个方格的国际象棋棋盘上,马(骑士)可以攻击的棋盘方格如图所示.棋盘 上某些方格设置了障碍,骑士不得进入. «编程任务:对于给定的n*n个方格的国际象棋棋盘和障碍标志 ...

  5. 网络流24题——骑士共存问题 luogu 3355

    题目描述:这里 从这里开始,我们涉及到了一个新的问题:最小割问题 首先给出一些定义(本人根据定义自己口胡的): 一个流网络中的一个割是一个边集,使得割掉这些边集后源点与汇点不连通 而最小割问题就是一个 ...

  6. loj #6226. 「网络流 24 题」骑士共存问题

    #6226. 「网络流 24 题」骑士共存问题   题目描述 在一个 n×n\text{n} \times \text{n}n×n 个方格的国际象棋棋盘上,马(骑士)可以攻击的棋盘方格如图所示.棋盘上 ...

  7. 【线性规划与网络流 24题】已完成(3道题因为某些奇怪的原因被抛弃了QAQ)

    写在前面:SDOI2016 Round1滚粗后蒟蒻开始做网络流来自我拯救(2016-04-11再过几天就要考先修课,现在做网络流24题貌似没什么用←退役节奏) 做的题目将附上日期,见证我龟速刷题. 1 ...

  8. 【算法】【网络流24题】巨坑待填(成功TJ,有时间再填)

    ------------------------------------------------------------------------------------ 17/24 --------- ...

  9. 网络流基础&网络流24题

    网络最大流 dinic+当前弧优化. const int N=10007,M=100007,inf=1e9; int s,t,head[N],ver[M],edge[M],Next[M],tot=1, ...

随机推荐

  1. Composer安装Yii2以及相关扩展

    1.安装redis扩展 命令:composer require yiisoft/yii2-redis Git地址:https://github.com/yiisoft/yii2-redis/blob/ ...

  2. 单例模式(Singleton)(单一实例)

    单例模式基本要点: 用于确保一个类只有一个实例,并且这个实例易于被访问. 让类自身负责保存他的唯一实例.这个类可以保证没有其他实例创建,并且他可以提供一个访问实例的方法,来实现单例模式. (1)把构造 ...

  3. 交叉熵-loss-理解

    参考链接: https://blog.csdn.net/tsyccnh/article/details/79163834

  4. hbase表内存的分布

  5. <init>与<clinit>的区别

    在编译生成class文件时,会自动产生两个方法,一个是类的初始化方法<clinit>, 另一个是实例的初始化方法<init> <clinit>:在jvm第一次加载c ...

  6. idea创建管理项目

    创建分支时以master为准,这时master上的代码已合并完毕,idea右下角可以看到本地和远程的分支,在本地合并时,先切换到master上,选中要合并到master的分支,选择merge into ...

  7. UVa-401 Palindromes回文词

    虽然是水题,但是容易错.参照了紫书的代码可以写的很简洁.主要还是注意常量数组的使用,能让代码变得简单许多 #include <iostream> #include <cstdio&g ...

  8. wsgi Python的WEB框架

    Bottle是一个快速.简洁.轻量级的基于WSIG的微型Web框架,此框架只由一个 .py 文件,除了Python的标准库外,其不依赖任何其他模块. pip install bottle easy_i ...

  9. 使用requireJs进行模块化开发

    requireJs使用 requireJs 使用require.js的第一步,是先去官方网站下载最新版本. 下载后,假定把它放在js子目录下面,就可以加载了. <script src=" ...

  10. 读书笔记--Struts 2 in Action 目录

    1.Struts 2:现代Web框架 1.1 web应用程序:快速学习 21.1.1 构建web应用程序 21.1.2 基础技术简介 31.1.3 深入研究 61.2 web应用程序框架 71.2.1 ...