长脖子鹿放置(最大流)
题意还是很容易理解的 感觉同(骑士共存问题)
主要就是建图了
将棋盘进行染色,这次不同于骑士共存那道题,这次直接对第几行染色
证明的话,自己yy了一个:
因为每一行无法到达的只有相邻的两行,那么就可以分情况了
若一行行数为奇数,那么将其与超级源点相连,流量为1
反之亦然,于超级汇点相连,同理流量为1
对于那些障碍点直接判掉就好了,
这样的话跟上面一样,在遍历整个图同时将不同的点进行相连,流量为INF,表示一种相连关系
最后愉快的跑一下最大流即可
题面
#include<bits/stdc++.h> using namespace std; const int N=1e6+7; const int INF=0x7f7f7f7f; int m,n,k,p,s,t,cnt=1,ans,tot; int dx[9]={0,-3,-3,-1,-1,1,1,3,3},dy[9]={0,-1,1,-3,3,-3,3,-1,1}; struct node {int nx,to,flow; } e[N]; int id(int x,int y) {return (x-1)*m+y;} int dep[N],head[N]; void add_edge(int a,int b,int flow) {cnt++;e[cnt].flow=flow;e[cnt].nx=head[a];e[cnt].to=b;head[a]=cnt;cnt++;e[cnt].flow=0;e[cnt].nx=head[b];e[cnt].to=a;head[b]=cnt; } bool used[210][210]; bool bfs(int s,int t) {queue<int> que;memset(dep,0,sizeof(dep));que.push(s);dep[s]=1;while (!que.empty()){int x=que.front();que.pop();for (int i=head[x];i;i=e[i].nx){int y=e[i].to;if (dep[y]==0&&e[i].flow){dep[y]=dep[x]+1;que.push(y);}}}if (dep[t]==0) return false;else return true; } int dfs(int x,int limit,int t) {if (x==t) return limit;int used=0;for (int i=head[x];i;i=e[i].nx){int y=e[i].to;if (dep[y]==dep[x]+1&&e[i].flow>0){int di=dfs(y,min(limit-used,e[i].flow),t);if (di>0){e[i].flow-=di;e[i^1].flow+=di;used+=di;if (used==limit) return used;}}}if (!used) dep[x]=-2;return used; } void dinic(int s,int t) {while (bfs(s,t)) {ans+=dfs(s,INF,t);tot++;} } int main() {scanf("%d%d%d",&n,&m,&p);s=N-3;t=N-4;for (int i=1;i<=p;i++){int x,y;scanf("%d%d",&x,&y);used[x][y]=true;}for (int i=1;i<=n;i++)for (int j=1;j<=m;j++)if (!used[i][j]){if (i%2==1) add_edge(s,id(i,j),1);else add_edge(id(i,j),t,1);}for (int i=1;i<=n;i++)for (int j=1;j<=m;j++){if (i%2!=1) continue;for (int k=1;k<=8;k++){int x=i+dx[k],y=j+dy[k];if (x<=0||y<=0||x>n||y>m) continue;if (used[x][y]) continue;add_edge(id(i,j),id(x,y),INF);}}dinic(s,t);printf("%d",n*m-ans-p);return 0; }
转载于:https://www.cnblogs.com/Hale522520/p/10630742.html
长脖子鹿放置(最大流)相关推荐
- P5030 长脖子鹿放置
题目背景 众周所知,在西洋棋中,我们有城堡.骑士.皇后.主教和长脖子鹿. 题目描述 如图所示,西洋棋的"长脖子鹿",类似于中国象棋的马,但按照"目"字攻击,且没 ...
- 洛谷[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\)式子,我们会想到我们学习进制转换中学到的,那么我们就只需要 ...
- 细水长flow之NICE:流模型的基本概念与实现
作者丨苏剑林 单位丨广州火焰信息科技有限公司 研究方向丨NLP,神经网络 个人主页丨kexue.fm 前言:自从在机器之心上看到了 Glow 模型之后(下一个GAN?OpenAI提出可逆生成模型Glo ...
- stream 定长循环_Java8之Stream流代替For循环操作
Stream流代替For循环进行输出可以使代码更简洁. 需求:根据姓名获取员工信息 1.建立实体类:Emp 2.测试类: (1.) 原始For写法: (2.) Stream流: 输出结果为: 补充知识 ...
- 电子产品“使用”和“放置”哪个寿命更长??
电子产品"使用"和"放置"究竟哪个寿命更长不能一概而论. 首先说"使用","使用"造成的老化多见于较大功率/能量密度的部 ...
- 长颈鹿的脖子变长其实不是因为吃高处的树叶?科学家在1700万年前的化石中找到答案...
6月3日,科研人员宣布通过奇异化石揭示长颈鹿演化谜题的关键驱动力.此前大家认为长颈鹿脖子伸长的动力是吃到高处的树叶,后来科学家发现,长脖子是雄性间为求偶竞争的武器.此次科研人员研究了一种奇异的早期长颈 ...
最新文章
- windoes windoes server 上安装mysql(MSI安装包安装、压缩包安装)
- php drive mssql,PHP 连接 MSSQL 2005/2008 以UTF8存取 并让ADODB支持的安装设置
- php后台无法登入,PHP magento后台无法登录问题解决方法
- WPF 使用FontAwesome字体图标
- ARP攻击网络上不去,可以进行mac地址绑定
- linux下anaconda3安装教程,Ubuntu18.04 安装 Anaconda3的教程详解
- Gartner:全行业投入人工智能,计算机视觉占比最高
- 2013年第8周日元宵节
- Oracle表重命名后索引、约束、权限、同义词的影响
- USB加密狗复制克隆软件
- kf真空接头标准尺寸_【真空】真空导入工艺详解!附具体操作步骤
- 计算机软件安装包后缀名,软件安装包程序是什么
- 三角形求高公式计算机,三角形已知边长求高公式有哪些
- sql server 字符串转成日期格式
- 蓝牙传输速率详细分析【针对蓝牙4.2]
- 多空线趋势策略-简易好用型
- SpringBoot + Java生成证书
- maven项目创建出错Could not calculate buil d plan:Plugin org.apache.maven.plugins 避坑
- Redis 基础 - 优惠券秒杀《初步优化(异步秒杀)》
- 用css解决Unigui在IE系列浏览器中字体变小的问题