刷题总结——蜥蜴(ssoj网络流)
题目:
题目背景
SCOI2007 DAY1 T3
题目描述
在一个 r 行 c 列的网格地图中有一些高度不同的石柱,一些石柱上站着一些蜥蜴,你的任务是让尽量多的蜥蜴逃到边界外。
每行每列中相邻石柱的距离为 1 ,蜥蜴的跳跃距离是 d ,即蜥蜴可以跳到平面距离不超过 d 的任何一个石柱上。石柱都不稳定,每次当蜥蜴跳跃时,所离开的石柱高度减 1(如果仍然落在地图内部,则到达的石柱高度不变),如果该石柱原来高度为 1 ,则蜥蜴离开后消失。以后其他蜥蜴不能落脚。任何时刻不能有两只蜥蜴在同一个石柱上。
输入格式
输入第一行为三个整数 r,c,d,即地图的规模与最大跳跃距离。
以下 r 行为石竹的初始状态,0 表示没有石柱,1~3 表示石柱的初始高度。
以下 r 行为蜥蜴位置,“L”表示蜥蜴,“.”表示没有蜥蜴。
输出格式
输出仅一行,包含一个整数,即无法逃离的蜥蜴总数的最小值。
样例数据 1
输入 [复制]
5 8 2
00000000
02000000
00321100
02000000
00000000
........
........
..LLLL..
........
........
输出
1
备注
【数据范围】
100% 的数据满足:1≤r,c≤20,1≤d≤3 。
题解:
感觉这题听经典的··拆点的建图方式在很多题中都有用到···而且感觉问”最多可以逃脱多少blabla···“都可以往这道题上想
这里建图引用hzwer的题解,%%%%%
对于每根石柱,采取一分为二的想法,即把一个点分为两个点(可抽象为石柱底部到顶部),其连线容量限制为石柱高度。
超级源与所有有蜥蜴的点相连,容量为1。
超级汇与地图内所有能跳出的点相连,容量为INF。
对于地图内任意两个石柱,如果间距小于d,就将其中一根石柱的顶部与另一根石柱的底部相连,其连线容量为INF。
构图完成,剩下就是跑一遍最大流,然后用蜥蜴数量减去最大流就是最终结果。
(接下来是我自己的话)一定要注意边的数量一定要开够啊!!wa了半天才发现····
代码:
#include<iostream> #include<cstdio> #include<cstdlib> #include<cmath> #include<ctime> #include<cctype> #include<cstring> #include<string> #include<algorithm> using namespace std; const int N=1005; const int inf=1e+9; int first[N],next[500001],go[500001],rest[500001],tot=1,src,des,lev[N*2],cur[N*2]; int map1[25][25],map2[25][25],num[25][25],cnt=0,ans=0,r,c,d; char s[25]; void comb(int a,int b,int c) {next[++tot]=first[a],first[a]=tot,go[tot]=b,rest[tot]=c;next[++tot]=first[b],first[b]=tot,go[tot]=a,rest[tot]=0; } bool jud(int a,int b,int x,int y) {if(((a-x)*(a-x)+(b-y)*(b-y))<=d*d)return true;elsereturn false; } void build() {for(int i=1;i<=r;i++)for(int j=1;j<=c;j++)num[i][j]=++cnt;for(int i=1;i<=r;i++){scanf("%s",s+1);for(int j=1;j<=c;j++){ map1[i][j]=s[j]-'0';if(map1[i][j])comb(num[i][j],num[i][j]+400,map1[i][j]);}} for(int i=1;i<=r;i++){scanf("%s",s+1);for(int j=1;j<=c;j++)if(s[j]=='L'){ comb(src,num[i][j],1);ans++;}}for(int i=1;i<=d;i++)for(int j=1;j<=r;j++)comb(num[j][i]+400,des,inf);for(int i=c-d+1;i<=c;i++)for(int j=1;j<=r;j++)comb(num[j][i]+400,des,inf);for(int i=d+1;i<=c-d;i++)for(int j=1;j<=d;j++)comb(num[j][i]+400,des,inf);for(int i=d+1;i<=c-d;i++)for(int j=r-d+1;j<=r;j++)comb(num[j][i]+400,des,inf);for(int i=1;i<=r;i++)for(int j=1;j<=c;j++)for(int k=i-d;k<=i+d;k++)for(int l=j-d;l<=j+d;l++)if(k>=1&&k<=r&&l>=1&&l<=c&&((i!=k)||(j!=l)))if(jud(i,j,k,l)) comb(num[i][j]+400,num[k][l],inf); } inline bool bfs() {for(int i=src;i<=des;i++) cur[i]=first[i],lev[i]=-1;static int que[N],tail,u,v;que[tail=1]=src;lev[src]=0;for(int head=1;head<=tail;head++){u=que[head];for(int e=first[u];e;e=next[e]){if(lev[v=go[e]]==-1&&rest[e]){lev[v]=lev[u]+1;que[++tail]=v;if(v==des) return true;}}}return false; } inline int dinic(int u,int flow) {if(u==des)return flow;int res=0,delta,v;for(int &e=cur[u];e;e=next[e]){if(lev[v=go[e]]>lev[u]&&rest[e]){delta=dinic(v,min(flow-res,rest[e]));if(delta){rest[e]-=delta;rest[e^1]+=delta;res+=delta;if(res==flow) break;}}}if(flow!=res) lev[u]=-1;return res; } inline void maxflow() {while(bfs())ans-=dinic(src,inf); } int main() {//freopen("a.in","r",stdin);src=0;des=805;scanf("%d%d%d",&r,&c,&d); build();maxflow();cout<<ans<<endl;return 0; }
转载于:https://www.cnblogs.com/AseanA/p/7463592.html
刷题总结——蜥蜴(ssoj网络流)相关推荐
- [刷题记录] luogu网络流24题 及 网络流心得体会 及 经典模型不定期更新
文章目录 信息汇总表格 飞行员配对方案问题 分配问题 运输问题 数字梯形问题 最小路径覆盖问题 魔术球问题 圆桌问题 试题库问题 深海机器人问题 航空路线问题 火星探险问题 太空飞行计划问题 方格取数 ...
- BZOJ第一页刷题计划
BZOJ第一页刷题计划 已完成:67 / 90 [BZOJ1000]A+B Problem:A+B: [BZOJ1001][BeiJing2006]狼抓兔子:最小割: [BZOJ1002][FJOI2 ...
- ACM比赛经验、刷题记录及模板库总结(更新中)
前言 本文所提及的部分题目代码,可以在我的Github上找到 第一部分 经验分享及感受 第二部分 刷题记录 一.基础算法&程序语言 //strlen()函数的复杂度是O(n)要小心 //截取字 ...
- 重走长征路---OI每周刷题记录---6月14日 2014
总目录详见https://blog.csdn.net/mrcrack/article/details/84471041 做题原则,找不到测评地址的题不做.2018-11-28 重走长征路---OI每周 ...
- 数据结构与算法书籍、视频、项目、网站、刷题技巧推荐(2021 年持续更新)...
今天整理出一些算法相关学习资源,包括书籍.算法刷题网站.项目资源.视频课程.面试要领这5个方面. 首先介绍一下技术书阅读方法论. 一.速读一遍(最好在1~2天内完成) 人的大脑记忆力有限,在一天内快速 ...
- 存档……【假装自己会刷题【怎么写着写着成了日记啊
2017.4.9 AFO 2017.2.27 嗨呀--昨天补了半天觉--十二点十分起床,稳,只有十二个小时的周末.rmvb 然后--下午来学校开黑,由于车速太快,一万个人翻车被skipped[捂脸]- ...
- 重走长征路---OI每周刷题记录---1月11日 2014
总目录详见https://blog.csdn.net/mrcrack/article/details/84471041 做题原则,找不到测评地址的题不做.2018-11-28 重走长征路---OI每周 ...
- 数据结构与算法书籍、视频、项目、网站、刷题技巧推荐(2021 年持续更新)......
今天整理出一些算法相关学习资源,包括书籍.算法刷题网站.项目资源.视频课程.面试要领这5个方面. 首先介绍一下技术书阅读方法论. 一.速读一遍(最好在1~2天内完成) 人的大脑记忆力有限,在一天内快速 ...
- 重走长征路---OI每周刷题记录---3月22日 2014
总目录详见https://blog.csdn.net/mrcrack/article/details/84471041 做题原则,找不到测评地址的题不做.2018-11-28 重走长征路---OI每周 ...
- 牛年前的一小结——打响本命年的第一枪,继续刷题!
经过一段时间的小尝试,摸索出了一点点头儿吧. 总结一下子. 关于面试的java,像我这个经验层次(1-2year普通厂)的都不会太难.最多超不出力扣中等难度. 多练习链表.树.指针类的比较基础的题目: ...
最新文章
- Objective-C语法之代码块(block)的使用
- Kotlin 系统入门到进阶
- wxWidgets:通过组合现有小部件制作新的可重用小部件
- git 工程工作目录下的git相关文件解释
- mysql中locat函数,MySQL中的LOCATE和POSITION函数使用方法 | 很文博客
- 软考系统架构师笔记-最后知识点总结(四)
- PSD分层模板|解析垂直化内容电商页面设计
- CSS文件未加载浏览器报警告:Resource interpreted as Stylesheet but transferred with MIME type text/html...
- oracle怎么查看索引表空间,oracle查看索引、表空间
- 内部审计具体准则第28号—信息系统审计
- 天线的回波损耗和驻波比
- java调用加密机实例_Enigma Java模拟实现恩尼格玛密码机加密解密过程 Develop 238万源代码下载- www.pudn.com...
- 为什么csgo一直显示连接官方服务器失败,CSGO提示连接任意官方服务器失败怎么办?五大详细解决方法看这里!...
- 多线程 java实验心得_java多线程编程体会
- iPhone屏幕尺寸(包含7p)
- 网吧用服务器做虚拟化,网吧内共享服务器搭建
- 腾讯云服务器+RAKSmart国内外服务器使用记录
- 深度学习基础知识整理
- 2020年电商行业的前景
- MATLAB机器人仿真:利用Simscape Multibody显示真实三维仿真模型