题目描述

在一个 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

3 2
1 1
3 3

output

5
//Serene
#include<algorithm>
#include<iostream>
#include<cstring>
#include<cstdlib>
#include<cstdio>
#include<cmath>
using namespace std;
const int maxn=200*200+10,maxm=4*maxn+maxn;
int n,k,S,T,tot;
bool pl[maxn]; int aa;char cc;
int read() {
aa=0;cc=getchar();
while(cc<'0'||cc>'9') cc=getchar();
while(cc>='0'&&cc<='9') aa=aa*10+cc-'0',cc=getchar();
return aa;
} struct Node{
int x,y,cap,flow;
}node[2*maxm]; int cur[maxn];
int fir[maxn],nxt[2*maxm],e=1;
void add(int x,int y,int z) {
node[++e].x=x;node[e].y=y;node[e].cap=z; nxt[e]=fir[x];fir[x]=e;
node[++e].x=y;node[e].y=x;node[e].cap=0; nxt[e]=fir[y];fir[y]=e;
} int zz[maxn],dis[maxn],s=1,t=0;
bool BFS() {
memset(dis,-1,sizeof(dis));
dis[S]=0; s=1,t=0;zz[++t]=S;
int x,y;
while(s<=t) {
x=zz[s];s++;
for(y=fir[x];y;y=nxt[y]) {
if(node[y].flow>=node[y].cap||dis[node[y].y]!=-1) continue;
dis[node[y].y]=dis[x]+1;
zz[++t]=node[y].y;
}
}
return dis[T]!=-1;
} int DFS(int pos,int maxf) {
if(pos==T||!maxf) return maxf;
int rs=0,now;
for(int &y=cur[pos];y;y=nxt[y]) {
if(node[y].flow>=node[y].cap||dis[node[y].y]!=dis[node[y].x]+1) continue;
now=DFS(node[y].y,min(maxf,node[y].cap-node[y].flow));
node[y].flow+=now;
node[y^1].flow-=now;
rs+=now;
maxf-=now;
}
if(!rs) dis[pos]=-1;
return rs;
} int Dinic() {
int rs=0;
while(BFS()) {
memcpy(cur,fir,sizeof(fir));
rs+=DFS(S,0x3f3f3f3f);
}
return rs;
} int main() {
n=read();k=read();tot=n*n;
int x,y; S=tot+1;T=S+1;
for(int i=1;i<=k;++i) {
x=read();y=read();
tot--;
pl[(x-1)*n+y]=1;
}
for(int i=1;i<=n;++i) for(int j=1;j<=n;++j) {
x=(i-1)*n+j;
if(pl[x]) continue;
if((i+j)%2==0) add(S,x,1); else add(x,T,1);
for(int r=1;r<=2;++r) {
if(i>r) {
int rr=3-r;
if(j>rr) {
y=x-r*n-rr;
if(!pl[y]) {
if((i+j)%2==0) add(x,y,1); else add(y,x,1);
}
}
if(j<=n-rr) {
y=x-r*n+rr;
if(!pl[y]) {
if((i+j)%2==0) add(x,y,1); else add(y,x,1);
}
}
}
}
}
printf("%d",tot-Dinic());
return 0;
}

  

最新文章

  1. SQL LOADER 的用法 TXT文件导入非常之快
  2. ncdu 磁盘目录查看工具
  3. arm-linux-objdump
  4. 003-python基础-变量与常量
  5. oracl使用DataBase Configuration Assistant创建、删除数据库
  6. 封装Unity3d的dll时的经验总结
  7. poj2488骑士之旅
  8. BestCoder Round #85 A B C
  9. 浅谈prototype和__proto__
  10. Git与Github的基本概念
  11. JVM学习笔记 -- 从一段几乎所有人代码都会犯错的代码开始
  12. 线程池ThreadPoolExecutor类的使用
  13. 【死磕 Spring】----- IOC 之深入理解 Spring IoC
  14. 初学Kafka工作原理流程介绍
  15. HZNU ACM一日游 2019.3.17 【2,4,6-三硝基甲苯(TNT)】
  16. spring 之 类型转换 2
  17. Fast R-CNN论文阅读笔记
  18. POJ 1679 The Unique MST (次小生成树)题解
  19. KNN PCA LDA
  20. layer的alert图

热门文章

  1. SQLServer-Version:SQLServer版本对应内部数据库版本号配置表
  2. [code] if (x&lt;0)x=0;else if (x&gt;255)x=255;
  3. springboot框架实现启动项目执行指定代码
  4. apk反编译(6)用ProGuard 混淆、压缩代码,压缩资源。
  5. Django项目:CRM(客户关系管理系统)--30--22PerfectCRM实现King_admin数据添加
  6. C#中使用设置(Settings.settings) Properties.Settings.Default
  7. Java中字符串为什么不以\0结尾
  8. Excel函数学习:HLOOKUP函数
  9. 文件上传之Java篇
  10. Eclipse-搭建springboot项目报错