题目背景

众周所知,在西洋棋中,我们有城堡、骑士、皇后、主教和长脖子鹿。

题目描述

如图所示,西洋棋的“长脖子鹿”,类似于中国象棋的马,但按照“目”字攻击,且没有中国象棋“别马腿”的规则。(因为长脖子鹿没有马腿)

给定一个N * M,的棋盘,有一些格子禁止放棋子。问棋盘上最多能放多少个不能互相攻击的长脖子鹿。

输入输出格式

输入格式:
输入的第一行为两个正整数N,M,K。其中K表示禁止放置长脖子鹿的格子数。

第22~第K+1行每一行为两个整数 Xi, Yi表示禁止放置的格子。

输出格式:
一行一个正整数,表示最多能放置的长脖子鹿个数。

代码

二分图的最大独立集,我们考虑如何进行黑白染色
如果我们按点来进行二分图建立的话,那么发现黑点都连黑点,白点都连白点。所以这样做一定是错的。
那么我们按行来进行黑白染色的话,这样就好了。

#include<bits/stdc++.h>
#define inf 0x3f3f3f3f
using namespace std;
const int maxn=300+5,maxm=800000+100;
int head[maxn*maxn],dis[maxn*maxn];
int cur[maxn*maxn];
bool mark[maxn][maxn];
int n,m,k;
int s,t;
struct egde
{int to,next,cap;
}e[maxm];
int size=1;
int dx[]={1,1,-1,-1,3,3,-3,-3},dy[]={3,-3,3,-3,1,-1,1,-1};
void addedge(int u,int v,int val)
{e[++size].to=v;e[size].cap=val;e[size].next=head[u];head[u]=size;e[++size].to=u;e[size].cap=0;e[size].next=head[v];head[v]=size;
}
inline int read()
{int x=0,f=1;char ch=getchar();while(ch>'9'||ch<'0'){if(ch=='-')f=-1;ch=getchar();}while(ch<='9'&&ch>='0'){x=(x<<3)+(x<<1)+ch-'0';ch=getchar();}return x*f;
}
bool bfs()
{memset(dis,0,sizeof(dis));deque<int>q;q.push_back(s);dis[s]=1;while(!q.empty()){int u=q.front();q.pop_front();for(int i=head[u];i;i=e[i].next){int to=e[i].to;if(!dis[to]&&e[i].cap>0){dis[to]=dis[u]+1;if(q.empty()||dis[to]>dis[q.front()])q.push_back(to);else q.push_front(to);}}}return dis[t];
}
int dinic(int u,int f)
{if(u==t)return f;for(int &i=cur[u];i;i=e[i].next){int to=e[i].to;if(dis[to]==dis[u]+1&&e[i].cap>0){int d=dinic(to,min(f,e[i].cap));if(d>0){e[i].cap-=d;e[i^1].cap+=d;return d;}}}return 0;
}
int maxflow()
{int flow=0;while(bfs()){memcpy(cur,head,sizeof(head));while(1){int f=dinic(s,inf);if(f==0)break;flow+=f;}}return flow;
}
int id(int i,int j)
{return (i-1)*m+j;
}
int main()
{n=read(),m=read(),k=read();s=0,t=n*m+1;for(int i=1;i<=k;i++)mark[read()][read()]=1;for(int i=1;i<=n;i++)for(int j=1;j<=m;j++){if(mark[i][j])continue;int u=id(i,j);if(i&1){addedge(s,u,1);for(int l=0;l<8;l++){int x=i+dx[l],y=j+dy[l];if(mark[x][y])continue;if(x<1||x>n||y<1||y>m)continue;int v=id(x,y);addedge(u,v,1);}}else addedge(u,t,1);}printf("%d",n*m-k-maxflow());return 0;
}

转载于:https://www.cnblogs.com/DriverBen/p/10576024.html

P5030 长脖子鹿放置相关推荐

  1. 长脖子鹿放置(最大流)

    题意还是很容易理解的  感觉同(骑士共存问题) 主要就是建图了 将棋盘进行染色,这次不同于骑士共存那道题,这次直接对第几行染色 证明的话,自己yy了一个: 因为每一行无法到达的只有相邻的两行,那么就可 ...

  2. 洛谷[LnOI2019]长脖子鹿省选模拟赛 简要题解

    传送门 听说比赛的时候T4T4T4标程锅了??? WTF换我时间我要写T3啊 于是在T4T4T4调半天无果的情况下260pts260pts260pts收场真的是tcltcltcl. T1 快速多项式变 ...

  3. 长脖子鹿省选模拟赛 [LnOI2019SP]快速多项式变换(FPT)

    本片题解设计两种解法 果然是签到题... 因为返回值问题T了好久... 第一眼:搜索大水题? 然后...竟然A了 1 #include<cstdio> 2 #include<queu ...

  4. [LnOI2019]长脖子鹿省选模拟赛 东京夏日相会

    这里来一发需要开毒瘤优化,并且几率很小一遍过的模拟退火题解... 友情提醒:如果你很久很久没有过某一个点,您可以加上特判 可以像 P1337 [JSOI2004]平衡点 / 吊打XXX 那道题目一样 ...

  5. [luogu#2019/03/10模拟赛][LnOI2019]长脖子鹿省选模拟赛赛后总结

    t1-快速多项式变换(FPT) 题解 看到这个\(f(x)=a_0+a_1x+a_2x^2+a_3x^3+ \cdots + a_nx^n\)式子,我们会想到我们学习进制转换中学到的,那么我们就只需要 ...

  6. 电子产品“使用”和“放置”哪个寿命更长??

    电子产品"使用"和"放置"究竟哪个寿命更长不能一概而论. 首先说"使用","使用"造成的老化多见于较大功率/能量密度的部 ...

  7. 长颈鹿的脖子变长其实不是因为吃高处的树叶?科学家在1700万年前的化石中找到答案...

    6月3日,科研人员宣布通过奇异化石揭示长颈鹿演化谜题的关键驱动力.此前大家认为长颈鹿脖子伸长的动力是吃到高处的树叶,后来科学家发现,长脖子是雄性间为求偶竞争的武器.此次科研人员研究了一种奇异的早期长颈 ...

  8. Python字符串详解(包含长字符串和原始字符串)

    若干个字符的集合就是一个字符串(String).Python 中的字符串必须由双引号" "或者单引号' '包围,具体格式为: "字符串内容" '字符串内容' 字 ...

  9. Java数组可变长参数详解

    在java5中提供了可变长参数,也就是在方法中一个可变长参数可以代表同一类型的多个参数(数组):变长参数使用String...str标识: 1.向可变长参数方法传递多个参数 package exten ...

最新文章

  1. MySQL中INSERT INTO SELECT的使用
  2. mongodb与mysql命令对比
  3. Android之通过ContentProvider实现两个app(进程间)间通信以及函数调用
  4. linux socat rpm,RabbitMQ系列(三)RabbitMQ Server的安装(基于Linux RPM)
  5. 看ADS如何治愈DDoS伤痛
  6. Nagios Plugin for Cacti (npc插件) Download 下载
  7. MYSQL 大数据性能优化
  8. mysql集群系统_轻松构建Mysql高可用集群系统
  9. ios带嗅探器的浏览器_MAC系统下 有没有像WIN系统的傲游浏览器那样有嗅探功能的呢?...
  10. 软件测试方案和计划的区别和联系
  11. Win10+VS2017+Pytorch-gpu+cude10.0+cudnn7.5环境搭建
  12. html 输入字数限制,说一说限制字数的输入框踩的坑
  13. ITSM系统_CMDB设计_业务要件
  14. mysql 存储过程 if !=_mysql 存储过程 if !=
  15. 7个少有人知的资源宝藏网站,浏览器瞬间爆棚!速速收藏
  16. 用python打印出一个人的照片_python爬取图片实例 - 一个人看日出,一个人看夕阳,一个人走路,一个人欢笑 - OSCHINA - 中文开源技术交流社区...
  17. Chrome插件 Tamper Dev
  18. android背光设置
  19. cmd查看CPU信息
  20. Java程序设计--Java入门(一)

热门文章

  1. Codeforces #467 (Div. 2) B. Vile Grasshoppers 蚂蚱的题目
  2. FITC标记亲和纯化大鼠抗小鼠IgG(H+L)二抗说明书
  3. 基于CentOS7.2安装win7虚拟机
  4. oracle rac密码,oracle rac如何修改密码,硬盘损坏如何恢复?
  5. antd 阿里图标库扩展a-icon 图标
  6. ubuntu 11.10使用fcitx双拼输入法
  7. 虚拟化 : VT-x VT-d VT-c的分别
  8. 什么是系统集成(SI)?
  9. 【科普】第二章 SIS 系统简介
  10. TCP/IP协议知多少