P5030 长脖子鹿放置
题目背景
众周所知,在西洋棋中,我们有城堡、骑士、皇后、主教和长脖子鹿。
题目描述
如图所示,西洋棋的“长脖子鹿”,类似于中国象棋的马,但按照“目”字攻击,且没有中国象棋“别马腿”的规则。(因为长脖子鹿没有马腿)
给定一个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 长脖子鹿放置相关推荐
- 长脖子鹿放置(最大流)
题意还是很容易理解的 感觉同(骑士共存问题) 主要就是建图了 将棋盘进行染色,这次不同于骑士共存那道题,这次直接对第几行染色 证明的话,自己yy了一个: 因为每一行无法到达的只有相邻的两行,那么就可 ...
- 洛谷[LnOI2019]长脖子鹿省选模拟赛 简要题解
传送门 听说比赛的时候T4T4T4标程锅了??? WTF换我时间我要写T3啊 于是在T4T4T4调半天无果的情况下260pts260pts260pts收场真的是tcltcltcl. T1 快速多项式变 ...
- 长脖子鹿省选模拟赛 [LnOI2019SP]快速多项式变换(FPT)
本片题解设计两种解法 果然是签到题... 因为返回值问题T了好久... 第一眼:搜索大水题? 然后...竟然A了 1 #include<cstdio> 2 #include<queu ...
- [LnOI2019]长脖子鹿省选模拟赛 东京夏日相会
这里来一发需要开毒瘤优化,并且几率很小一遍过的模拟退火题解... 友情提醒:如果你很久很久没有过某一个点,您可以加上特判 可以像 P1337 [JSOI2004]平衡点 / 吊打XXX 那道题目一样 ...
- [luogu#2019/03/10模拟赛][LnOI2019]长脖子鹿省选模拟赛赛后总结
t1-快速多项式变换(FPT) 题解 看到这个\(f(x)=a_0+a_1x+a_2x^2+a_3x^3+ \cdots + a_nx^n\)式子,我们会想到我们学习进制转换中学到的,那么我们就只需要 ...
- 电子产品“使用”和“放置”哪个寿命更长??
电子产品"使用"和"放置"究竟哪个寿命更长不能一概而论. 首先说"使用","使用"造成的老化多见于较大功率/能量密度的部 ...
- 长颈鹿的脖子变长其实不是因为吃高处的树叶?科学家在1700万年前的化石中找到答案...
6月3日,科研人员宣布通过奇异化石揭示长颈鹿演化谜题的关键驱动力.此前大家认为长颈鹿脖子伸长的动力是吃到高处的树叶,后来科学家发现,长脖子是雄性间为求偶竞争的武器.此次科研人员研究了一种奇异的早期长颈 ...
- Python字符串详解(包含长字符串和原始字符串)
若干个字符的集合就是一个字符串(String).Python 中的字符串必须由双引号" "或者单引号' '包围,具体格式为: "字符串内容" '字符串内容' 字 ...
- Java数组可变长参数详解
在java5中提供了可变长参数,也就是在方法中一个可变长参数可以代表同一类型的多个参数(数组):变长参数使用String...str标识: 1.向可变长参数方法传递多个参数 package exten ...
最新文章
- MySQL中INSERT INTO SELECT的使用
- mongodb与mysql命令对比
- Android之通过ContentProvider实现两个app(进程间)间通信以及函数调用
- linux socat rpm,RabbitMQ系列(三)RabbitMQ Server的安装(基于Linux RPM)
- 看ADS如何治愈DDoS伤痛
- Nagios Plugin for Cacti (npc插件) Download 下载
- MYSQL 大数据性能优化
- mysql集群系统_轻松构建Mysql高可用集群系统
- ios带嗅探器的浏览器_MAC系统下 有没有像WIN系统的傲游浏览器那样有嗅探功能的呢?...
- 软件测试方案和计划的区别和联系
- Win10+VS2017+Pytorch-gpu+cude10.0+cudnn7.5环境搭建
- html 输入字数限制,说一说限制字数的输入框踩的坑
- ITSM系统_CMDB设计_业务要件
- mysql 存储过程 if !=_mysql 存储过程 if !=
- 7个少有人知的资源宝藏网站,浏览器瞬间爆棚!速速收藏
- 用python打印出一个人的照片_python爬取图片实例 - 一个人看日出,一个人看夕阳,一个人走路,一个人欢笑 - OSCHINA - 中文开源技术交流社区...
- Chrome插件 Tamper Dev
- android背光设置
- cmd查看CPU信息
- Java程序设计--Java入门(一)
热门文章
- Codeforces #467 (Div. 2) B. Vile Grasshoppers 蚂蚱的题目
- FITC标记亲和纯化大鼠抗小鼠IgG(H+L)二抗说明书
- 基于CentOS7.2安装win7虚拟机
- oracle rac密码,oracle rac如何修改密码,硬盘损坏如何恢复?
- antd 阿里图标库扩展a-icon 图标
- ubuntu 11.10使用fcitx双拼输入法
- 虚拟化 : VT-x VT-d VT-c的分别
- 什么是系统集成(SI)?
- 【科普】第二章 SIS 系统简介
- TCP/IP协议知多少