网络流24题 骑士共存(DCOJ8023)
题目描述
在一个 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<n2),分别表示棋盘的大小和障碍数。接下来的 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;
- }
网络流24题 骑士共存(DCOJ8023)的更多相关文章
- AC日记——[网络流24题]骑士共存 cogs 746
746. [网络流24题] 骑士共存 ★★☆ 输入文件:knight.in 输出文件:knight.out 简单对比时间限制:1 s 内存限制:128 MB 骑士共存问题 «问题描述: ...
- Cogs 746. [网络流24题] 骑士共存(最大独立集)
[网络流24题] 骑士共存 ★★☆ 输入文件:knight.in 输出文件:knight.out 简单对比 时间限制:1 s 内存限制:128 MB 骑士共存问题 «问题描述: 在一个n*n个方格的国 ...
- COGS746. [网络流24题] 骑士共存
骑士共存问题«问题描述:在一个n*n个方格的国际象棋棋盘上,马(骑士)可以攻击的棋盘方格如图所示.棋盘 上某些方格设置了障碍,骑士不得进入. «编程任务:对于给定的n*n个方格的国际象棋棋盘和障碍标志 ...
- [网络流24题] 骑士共存(cogs 746)
骑士共存问题«问题描述:在一个n*n个方格的国际象棋棋盘上,马(骑士)可以攻击的棋盘方格如图所示.棋盘 上某些方格设置了障碍,骑士不得进入. «编程任务:对于给定的n*n个方格的国际象棋棋盘和障碍标志 ...
- 网络流24题——骑士共存问题 luogu 3355
题目描述:这里 从这里开始,我们涉及到了一个新的问题:最小割问题 首先给出一些定义(本人根据定义自己口胡的): 一个流网络中的一个割是一个边集,使得割掉这些边集后源点与汇点不连通 而最小割问题就是一个 ...
- loj #6226. 「网络流 24 题」骑士共存问题
#6226. 「网络流 24 题」骑士共存问题 题目描述 在一个 n×n\text{n} \times \text{n}n×n 个方格的国际象棋棋盘上,马(骑士)可以攻击的棋盘方格如图所示.棋盘上 ...
- 【线性规划与网络流 24题】已完成(3道题因为某些奇怪的原因被抛弃了QAQ)
写在前面:SDOI2016 Round1滚粗后蒟蒻开始做网络流来自我拯救(2016-04-11再过几天就要考先修课,现在做网络流24题貌似没什么用←退役节奏) 做的题目将附上日期,见证我龟速刷题. 1 ...
- 【算法】【网络流24题】巨坑待填(成功TJ,有时间再填)
------------------------------------------------------------------------------------ 17/24 --------- ...
- 网络流基础&网络流24题
网络最大流 dinic+当前弧优化. const int N=10007,M=100007,inf=1e9; int s,t,head[N],ver[M],edge[M],Next[M],tot=1, ...
随机推荐
- Composer安装Yii2以及相关扩展
1.安装redis扩展 命令:composer require yiisoft/yii2-redis Git地址:https://github.com/yiisoft/yii2-redis/blob/ ...
- 单例模式(Singleton)(单一实例)
单例模式基本要点: 用于确保一个类只有一个实例,并且这个实例易于被访问. 让类自身负责保存他的唯一实例.这个类可以保证没有其他实例创建,并且他可以提供一个访问实例的方法,来实现单例模式. (1)把构造 ...
- 交叉熵-loss-理解
参考链接: https://blog.csdn.net/tsyccnh/article/details/79163834
- hbase表内存的分布
- <init>与<clinit>的区别
在编译生成class文件时,会自动产生两个方法,一个是类的初始化方法<clinit>, 另一个是实例的初始化方法<init> <clinit>:在jvm第一次加载c ...
- idea创建管理项目
创建分支时以master为准,这时master上的代码已合并完毕,idea右下角可以看到本地和远程的分支,在本地合并时,先切换到master上,选中要合并到master的分支,选择merge into ...
- UVa-401 Palindromes回文词
虽然是水题,但是容易错.参照了紫书的代码可以写的很简洁.主要还是注意常量数组的使用,能让代码变得简单许多 #include <iostream> #include <cstdio&g ...
- wsgi Python的WEB框架
Bottle是一个快速.简洁.轻量级的基于WSIG的微型Web框架,此框架只由一个 .py 文件,除了Python的标准库外,其不依赖任何其他模块. pip install bottle easy_i ...
- 使用requireJs进行模块化开发
requireJs使用 requireJs 使用require.js的第一步,是先去官方网站下载最新版本. 下载后,假定把它放在js子目录下面,就可以加载了. <script src=" ...
- 读书笔记--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 ...