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

题目描述

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

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

输入格式

第一行有两个正整数 n\text{n}n 和 m\text{m}m (1≤n≤200,0≤m≤n2−1)( 1 \leq n \leq 200, 0 \leq m \leq n^2 - 1 )(1≤n≤200,0≤m≤n​2​​−1) 分别表示棋盘的大小和障碍数。

输出格式

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

样例

样例输入

3 2
1 1
3 3

样例输出

5

数据范围与提示

1≤n≤2001\leq n\leq 2001≤n≤200

0≤m≤n2−10 \leq m \leq n^2-10≤m≤n​2​​−1

/*加了当前弧优化和读入优化,快了不少
*/
#include<iostream>
#include<cstdio>
#include<cstring>
#include<queue>
#define maxn 40010
#define INF 1000000000
int n,m,head[maxn],dis[maxn],num=1,S,T,cur[maxn];
bool vis[maxn],mark[maxn];
struct node{int to,pre,v;}e[maxn*50];
using namespace std;
int count(int x,int y){return n*(x-1)+y;}
void Insert(int from,int to,int v){e[++num].to=to;e[num].v=v;e[num].pre=head[from];head[from]=num;e[++num].to=from;e[num].v=0;e[num].pre=head[to];head[to]=num;
}
bool bfs(){for(int i=S;i<=T;i++)dis[i]=-1,cur[i]=head[i];queue<int>q;q.push(S);dis[S]=0;while(!q.empty()){int now=q.front();q.pop();for(int i=head[now];i;i=e[i].pre){int to=e[i].to;if(e[i].v>0&&dis[to]==-1){dis[to]=dis[now]+1;if(to==T)return 1;q.push(to);}}}return dis[T]!=-1;
}
int dinic(int x,int flow){if(x==T||flow==0){return flow;}int rest=flow;for(int &i=cur[x];i;i=e[i].pre){int to=e[i].to;if(dis[to]==dis[x]+1&&e[i].v>0){int delta=dinic(to,min(rest,e[i].v));e[i].v-=delta;e[i^1].v+=delta;rest-=delta;}}return flow-=rest;
}
bool check(int x,int y){if(x<=n&&x>=1&&y<=n&&y>=1&&!mark[count(x,y)])return 1;return 0;
}
int qread(){int i=0,j=1;char ch=getchar();while(ch<'0'||ch>'9'){if(ch=='-')j=-1;ch=getchar();}while(ch<='9'&&ch>='0'){i=i*10+ch-'0';ch=getchar();}return i*j;
}
int main(){n=qread();m=qread();S=0,T=n*n+1;int x,y;for(int i=1;i<=m;i++){x=qread();y=qread();mark[count(x,y)]=1;}for(int i=1;i<=n;i++){for(int j=1;j<=n;j++){if(mark[count(i,j)])continue;if((i+j)&1){Insert(S,count(i,j),1);if(check(i-1,j-2))Insert(count(i,j),count(i-1,j-2),1);if(check(i-1,j+2))Insert(count(i,j),count(i-1,j+2),1);if(check(i+1,j-2))Insert(count(i,j),count(i+1,j-2),1);if(check(i+1,j+2))Insert(count(i,j),count(i+1,j+2),1);if(check(i-2,j-1))Insert(count(i,j),count(i-2,j-1),1);if(check(i-2,j+1))Insert(count(i,j),count(i-2,j+1),1);if(check(i+2,j-1))Insert(count(i,j),count(i+2,j-1),1);if(check(i+2,j+1))Insert(count(i,j),count(i+2,j+1),1);}else Insert(count(i,j),T,1);}}int ans=0;while(bfs())ans+=dinic(S,INF);printf("%d",n*n-ans-m);
}

转载于:https://www.cnblogs.com/thmyl/p/8939760.html

loj #6226. 「网络流 24 题」骑士共存问题相关推荐

  1. loj #6004. 「网络流 24 题」圆桌聚餐(最大流)

    #6004. 「网络流 24 题」圆桌聚餐 内存限制:256 MiB时间限制:5000 ms标准输入输出 题目类型:传统评测方式:Special Judge 上传者: 匿名 提交提交记录统计讨论测试数 ...

  2. 【刷题】LOJ 6011 「网络流 24 题」运输问题

    题目描述 W 公司有 \(m\) 个仓库和 \(n\) 个零售商店.第 \(i\) 个仓库有 \(a_i\) 个单位的货物:第 \(j\) 个零售商店需要 \(b_j\) 个单位的货物.货物供需平衡, ...

  3. LOJ#6002. 「网络流 24 题」最小路径覆盖

    模板. 1 #include<iostream> 2 #include<cstring> 3 #include<cstdio> 4 //#include<ti ...

  4. 【刷题】LOJ 6014 「网络流 24 题」最长 k 可重区间集

    题目描述 给定实直线 \(L\) 上 \(n\) 个开区间组成的集合 \(I\) ,和一个正整数 \(k\) ,试设计一个算法,从开区间集合 \(I\) 中选取出开区间集合 \(S \subseteq ...

  5. 【刷题】LOJ 6005 「网络流 24 题」最长递增子序列

    题目描述 给定正整数序列 \(x_1 \sim x_n\) ,以下递增子序列均为非严格递增. 计算其最长递增子序列的长度 \(s\) . 计算从给定的序列中最多可取出多少个长度为 \(s\) 的递增子 ...

  6. 「网络流24题」 题目列表

    「网络流24题」 题目列表 序号 题目标题 模型 题解 1 飞行员配对方案问题 二分图最大匹配 <1> 2 太空飞行计划问题 最大权闭合子图 <2> 3 最小路径覆盖问题 二分 ...

  7. LibreOJ #6001. 「网络流 24 题」太空飞行计划 最大权闭合图

    #6001. 「网络流 24 题」太空飞行计划 内存限制:256 MiB时间限制:1000 ms标准输入输出 题目类型:传统评测方式:Special Judge 上传者: 匿名 提交提交记录统计讨论测 ...

  8. LibreOJ 6004. 「网络流 24 题」圆桌聚餐 网络流版子题

    #6004. 「网络流 24 题」圆桌聚餐 内存限制:256 MiB时间限制:5000 ms标准输入输出 题目类型:传统评测方式:Special Judge 上传者: 匿名 提交提交记录统计讨论测试数 ...

  9. 「网络流24题」 12. 软件补丁问题

    「网络流24题」 12. 软件补丁问题 状压 DP,SPFA 转移. 没错,跟网络流没任何关系. b1.b2.f1.f2 都用二进制存下来,第 i 位表示是否有这个错误. 然后从每位都是 1 到 0 ...

最新文章

  1. 【camera-lidar】自动驾驶相机-激光雷达融合方案综述
  2. apache2.4.9 开启path_info访问_浅淡flask在win下用Apache24及mod_wsgi部署的那些坑
  3. Toolbar中menu菜单文字颜色的修改
  4. c 语言程序设计教程 沈显君 答案,CD3计算机实践《C/C++语言程序设计》报告模板2.doc...
  5. mybatis-config.xml
  6. Windows Vista Ultimate试用
  7. Flash Builder 找不到所需的 Adobe Flash Player
  8. 软件测试遇到的异常情况,豪之诺软件测试项目开发中遇到比较多的Bug总结
  9. LeetCode 344 反转字符串
  10. 翁同龢后人向上海博物馆捐赠两件重要家藏
  11. 小米屏下摄像头专利曝光!或为小米mix4准备?
  12. 平滑线反锯齿工具_Photoshop中的华丽渐变工具的使用
  13. vim编辑器的简单使用
  14. git入门:安装配置 创建版本库
  15. jmeter使用_Jmeter之Remote Testing使用
  16. onenote使用python开发_如何充分利用 OneNote,发挥它的全部价值和潜力?
  17. 分享一个linux下的steam的rpm安装包的链接
  18. 数据库容灾技术之–数据容灾技术比较
  19. 阿里天池龙珠计划-SQL训练营-Task06
  20. OS学习笔记-7(清华大学慕课)实验二物理内存管理

热门文章

  1. thinkphp url缩短
  2. 进程通信QSharedMemory
  3. Oracle 12c In-Memory Option应用解析
  4. ahjesus Ubuntu配置svn服务器
  5. Linux下查看在运行进程的命令
  6. Leetcode 107. 二叉树的层次遍历 II 解题思路及C++实现
  7. PCA计算流程详解与实现(Python详细编码,全部测试正确,与sklearn完全一致,只有7行代码)
  8. 模糊数学笔记:二、模糊截集与分解定理
  9. Apache Ignite与Apache Hive的个人理解与总结
  10. x12arima季节调整方法_降低农村生活污水处理设备运营成本的方法