题目:

题目背景

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网络流)相关推荐

  1. [刷题记录] luogu网络流24题 及 网络流心得体会 及 经典模型不定期更新

    文章目录 信息汇总表格 飞行员配对方案问题 分配问题 运输问题 数字梯形问题 最小路径覆盖问题 魔术球问题 圆桌问题 试题库问题 深海机器人问题 航空路线问题 火星探险问题 太空飞行计划问题 方格取数 ...

  2. BZOJ第一页刷题计划

    BZOJ第一页刷题计划 已完成:67 / 90 [BZOJ1000]A+B Problem:A+B: [BZOJ1001][BeiJing2006]狼抓兔子:最小割: [BZOJ1002][FJOI2 ...

  3. ACM比赛经验、刷题记录及模板库总结(更新中)

    前言 本文所提及的部分题目代码,可以在我的Github上找到 第一部分 经验分享及感受 第二部分 刷题记录 一.基础算法&程序语言 //strlen()函数的复杂度是O(n)要小心 //截取字 ...

  4. 重走长征路---OI每周刷题记录---6月14日 2014

    总目录详见https://blog.csdn.net/mrcrack/article/details/84471041 做题原则,找不到测评地址的题不做.2018-11-28 重走长征路---OI每周 ...

  5. 数据结构与算法书籍、视频、项目、网站、刷题技巧推荐(2021 年持续更新)...

    今天整理出一些算法相关学习资源,包括书籍.算法刷题网站.项目资源.视频课程.面试要领这5个方面. 首先介绍一下技术书阅读方法论. 一.速读一遍(最好在1~2天内完成) 人的大脑记忆力有限,在一天内快速 ...

  6. 存档……【假装自己会刷题【怎么写着写着成了日记啊

    2017.4.9 AFO 2017.2.27 嗨呀--昨天补了半天觉--十二点十分起床,稳,只有十二个小时的周末.rmvb 然后--下午来学校开黑,由于车速太快,一万个人翻车被skipped[捂脸]- ...

  7. 重走长征路---OI每周刷题记录---1月11日 2014

    总目录详见https://blog.csdn.net/mrcrack/article/details/84471041 做题原则,找不到测评地址的题不做.2018-11-28 重走长征路---OI每周 ...

  8. 数据结构与算法书籍、视频、项目、网站、刷题技巧推荐(2021 年持续更新)......

    今天整理出一些算法相关学习资源,包括书籍.算法刷题网站.项目资源.视频课程.面试要领这5个方面. 首先介绍一下技术书阅读方法论. 一.速读一遍(最好在1~2天内完成) 人的大脑记忆力有限,在一天内快速 ...

  9. 重走长征路---OI每周刷题记录---3月22日 2014

    总目录详见https://blog.csdn.net/mrcrack/article/details/84471041 做题原则,找不到测评地址的题不做.2018-11-28 重走长征路---OI每周 ...

  10. 牛年前的一小结——打响本命年的第一枪,继续刷题!

    经过一段时间的小尝试,摸索出了一点点头儿吧. 总结一下子. 关于面试的java,像我这个经验层次(1-2year普通厂)的都不会太难.最多超不出力扣中等难度. 多练习链表.树.指针类的比较基础的题目: ...

最新文章

  1. Objective-C语法之代码块(block)的使用
  2. Kotlin 系统入门到进阶
  3. wxWidgets:通过组合现有小部件制作新的可重用小部件
  4. git 工程工作目录下的git相关文件解释
  5. mysql中locat函数,MySQL中的LOCATE和POSITION函数使用方法 | 很文博客
  6. 软考系统架构师笔记-最后知识点总结(四)
  7. PSD分层模板|解析垂直化内容电商页面设计
  8. CSS文件未加载浏览器报警告:Resource interpreted as Stylesheet but transferred with MIME type text/html...
  9. oracle怎么查看索引表空间,oracle查看索引、表空间
  10. 内部审计具体准则第28号—信息系统审计
  11. 天线的回波损耗和驻波比
  12. java调用加密机实例_Enigma Java模拟实现恩尼格玛密码机加密解密过程 Develop 238万源代码下载- www.pudn.com...
  13. 为什么csgo一直显示连接官方服务器失败,CSGO提示连接任意官方服务器失败怎么办?五大详细解决方法看这里!...
  14. 多线程 java实验心得_java多线程编程体会
  15. iPhone屏幕尺寸(包含7p)
  16. 网吧用服务器做虚拟化,网吧内共享服务器搭建
  17. 腾讯云服务器+RAKSmart国内外服务器使用记录
  18. 深度学习基础知识整理
  19. 2020年电商行业的前景
  20. MATLAB机器人仿真:利用Simscape Multibody显示真实三维仿真模型

热门文章

  1. 宽字符与Unicode
  2. iptables详解和snat dnat
  3. Orchard核心机制
  4. EditText控件(圆角处理)
  5. windows下的route print [转]
  6. 特殊的网络环境下的故障处理
  7. vmware挂载共享目录
  8. vue前端项目中excel文件下载
  9. Nginx/Apache/Tomcat记录屏蔽真实IP
  10. 父子类之间,成员函数重写、重载以及重定义的区别