bzoj1066 蜥蜴 (dinic)
最大流板子题。
对于每根柱子,建两个点ai,bi,建边(ai,bi,柱子高度)
对于距离不超过d的两根柱子i,j,建边(bi,aj,inf)
对于起始位置在i的每个蜥蜴,建边(S,ai,1)
对于能跳出地图的柱子i,建边(bi,E,inf)
然后跑dinic即可
#include<cstdio> #include<cstring> #include<algorithm> #include<queue> using namespace std; const int maxn=23,inf=0x3f3f3f3f;struct Edge{int a,b,v;int ne; }eg[maxn*maxn*maxn*maxn*4];int R,C,D,pcnt,rcnt,ecnt; int map[maxn][maxn][2]; int rd[100][2]; int egh[maxn*maxn*2],P[maxn][maxn][2]; int deep[maxn*maxn*2];inline void addedge(int a,int b,int v){eg[ecnt].a=a;eg[ecnt].b=b;eg[ecnt].v=v;eg[ecnt].ne=egh[a];egh[a]=ecnt++;eg[ecnt].a=b;eg[ecnt].b=a;eg[ecnt].v=0;eg[ecnt].ne=egh[b];egh[b]=ecnt++; }bool bfs(){queue<int> q;memset(deep,0,sizeof(deep));q.push(1);deep[1]=1;while(!q.empty()){int p=q.front();q.pop();for(int i=egh[p];i!=-1;i=eg[i].ne){if(eg[i].v&&!deep[eg[i].b]){q.push(eg[i].b);deep[eg[i].b]=deep[p]+1;}}}return deep[2]; }int dinic(int x,int l){if(x==2) return l;int tmp=l;for(int i=egh[x];i!=-1;i=eg[i].ne){if(deep[eg[i].b]!=deep[x]+1||!eg[i].v) continue;int re=dinic(eg[i].b,min(eg[i].v,l));if(!re) deep[eg[i].b]=0;tmp-=re;eg[i].v-=re;eg[i^1].v+=re;if(!tmp) break;}return l-tmp; }int main(){int i,j,k,ans=0;char s[maxn];//freopen("1066.in","r",stdin);scanf("%d%d%d",&R,&C,&D);for(i=1;i<=R;i++){scanf("%s",s+1);for(j=1;j<=C;j++) map[i][j][0]=s[j]-'0';}for(i=1;i<=R;i++){scanf("%s",s+1);for(j=1;j<=C;j++) map[i][j][1]=(s[j]=='L'?1:0);}for(i=-D;i<=D;i++){for(j=-D;j<=D;j++){if(i*i+j*j<=D*D){rd[rcnt][0]=i;rd[rcnt++][1]=j;}}}pcnt=2;memset(egh,-1,sizeof(egh));for(i=1;i<=R;i++) for(j=1;j<=C;j++) if(map[i][j][0]){P[i][j][0]=++pcnt;P[i][j][1]=++pcnt;addedge(P[i][j][0],P[i][j][1],map[i][j][0]);if(map[i][j][1]) {addedge(1,P[i][j][0],1);ans++;}}for(i=1;i<=R;i++){for(j=1;j<=C;j++){if(!map[i][j][0]) continue;bool b=0;for(k=0;k<rcnt;k++){int ii=i+rd[k][0],jj=j+rd[k][1];if(ii<=0||ii>R||jj<=0||jj>C) b=1;else if(map[ii][jj]) addedge(P[i][j][1],P[ii][jj][0],inf);}if(b) addedge(P[i][j][1],2,inf);}}while(bfs()) ans-=dinic(1,inf);printf("%d",ans); }
转载于:https://www.cnblogs.com/Ressed/p/9354379.html
bzoj1066 蜥蜴 (dinic)相关推荐
- BZOJ1066 蜥蜴
[题目描述] 在一个r行c列的网格地图中有一些高度不同的石柱,一些石柱上站着一些蜥蜴,你的任务是让尽量多的蜥蜴逃到边界外. 每行每列中相邻石柱的距离为1,蜥蜴的跳跃距离是d,即蜥蜴可以跳到平面距离不超 ...
- BZOJ-1066 蜥蜴 最大流+拆点+超级源超级汇
1066: [SCOI2007]蜥蜴 Time Limit: 1 Sec Memory Limit: 162 MB Submit: 2582 Solved: 1272 [Submit][Status] ...
- BZOJ1066: [SCOI2007]蜥蜴
1066: [SCOI2007]蜥蜴 Time Limit: 1 Sec Memory Limit: 162 MB Submit: 4506 Solved: 2305 [Submit][Statu ...
- BZOJ1066【SCOI2007】蜥蜴 网络流
[SCOI2007]蜥蜴 Description 在一个r行c列的网格地图中有一些高度不同的石柱,一些石柱上站着一些蜥蜴,你的任务是让尽量多的蜥蜴逃到边界外. 每行每列中相邻石柱的距离为1,蜥蜴的跳跃 ...
- 【codevs2440】【BZOJ1066】蜥蜴,最大流
Time:2016.05.29 Author:xiaoyimi 转载注明出处谢谢 思路: (水题硬是让我调了1h+) a[i][j]为第i行第j列的石柱高度 把每个石柱i拆成两个点pi,qi,连边流量 ...
- bzoj1066 [SCOI2007]蜥蜴 网络流复制点模型
比较基本的复制点一个接收一个出边的网络流模型, 用自己向自己的边限制流出个数 注意细节: 1.判断是<1不是<0 2.n*m+ 3.ij.kl 码: #include<iostrea ...
- [SCOI2007]蜥蜴 (网格图经典四方向建边)
题意: 在一个n*m的矩阵中,每个格子都有一定的高度,当高度为0时表示该格子不存在,现在这个矩阵中有若干只蜥蜴,每只蜥蜴跳到格子上时,该格子的高度会减一,每只蜥蜴可以跳跃直线距离不大于D的长度,问最少 ...
- 洛谷 - P2472 [SCOI2007]蜥蜴(最大流)
题目链接:点击查看 题目大意:给出一个 n * m 的迷宫,每个位置都有一个耐久度,也就是至多经过 a[ i ][ j ] 位置 ( i , j ),现在迷宫中有一些蜥蜴,每一时刻在每一个位置至多有一 ...
- 1066. [SCOI2007]蜥蜴【最大流】
Description 在一个r行c列的网格地图中有一些高度不同的石柱,一些石柱上站着一些蜥蜴,你的任务是让尽量多的蜥蜴逃 到边界外. 每行每列中相邻石柱的距离为1,蜥蜴的跳跃距离是d,即蜥蜴可以跳到 ...
最新文章
- 记一次vue2路由参数传递this指针问题
- 19、SQL Server 数据修改之Insert into
- 各类环境渗透测试简述
- 作业19——夜间模式的开启与关闭,父模板的制作
- django中使用原生sql
- Google在KDD2013上关于CTR的一篇论文
- 在Linux下使用命令发送邮件附件
- 9.4SAS软件入门
- 使用js实现简单的注册验证
- 网络编程基础(Socket ServerSocket)
- 墨迹天气3.0引导动画
- 卡洛斯·斯利姆·埃卢
- 基于MATLAB颜色的植物虫害检测识别
- Android调用系统设置界面
- 雷电模拟器桥接模式不显示网卡,4版本不能设置代理
- 5、判断、循环、数组综合练习案例(迷你DVD)
- 【MATLAB】理解采样频率和信号频率的关系
- 日本测试人工智能破案,“机械战警”渐行渐近
- 纯配置方式使用durid的数据库密码加密
- RFP红色荧光蛋白抗体——Nature、Cell高分文章