【网络流】【BZOJ1006】【SCOI2007】蜥蜴
学弟@lher在周末训练赛中出的题目的原题(这个人拿省选题来当作提高组模拟,太丧了。。。)
题意简析:看题目:)
解题思路:题目显然是最大流。
首先拆点将点权变为边权,然后按照题意对于所有有跳板的点向可以跳到的点连一条权值为inf的边,对于能够跳出地图边界的点,将它与汇点连一条权值为inf的边。对于有蜥蜴的点,从源点向这个点连一条权值为1的边,然后跑一次最大流,答案就是蜥蜴数-最大流。
AC代码:
- #include<stdio.h>
- #include<iostream>
- #include<cmath>
- #include<cstring>
- #include<string>
- #include<algorithm>
- #define ll long long
- #define inf 0x7fffffff
- using namespace std;
- struct zxy{
- int next,to,v;
- }edge[];
- int n,m,d,head[],iter[],lev[],que[],cnt=,mz=;
- bool b[][];
- inline int getno(int x,int y){ return (x-)*m+y;}
- inline int getdis(int x,int y,int a,int b){ return ceil(sqrt((x-a)*(x-a)+(y-b)*(y-b)));}
- inline void ins(int x,int y,int l){edge[++cnt].next=head[x],head[x]=cnt,edge[cnt].to=y,edge[cnt].v=l;}
- inline int in(){
- int x=,f=;
- char ch=getchar();
- while(ch<''||ch>'') {if(ch=='-') f=-; ch=getchar();}
- while(ch>=''&&ch<='') x=x*+ch-'',ch=getchar();
- return x*f;
- }
- inline bool bfs(int s,int e){
- memset(lev,-,sizeof(lev));
- int t=,h=;
- que[]=s;
- lev[s]=;
- do{
- h++;
- int k=head[que[h]];
- while(k){
- if (lev[edge[k].to]==-&&edge[k].v){
- lev[edge[k].to]=lev[que[h]]+;
- que[++t]=edge[k].to;
- }
- k=edge[k].next;
- }
- }while(h<t);
- return lev[e]!=-;
- }
- inline int dfs(int u,int v,int f){
- if (u==v) return f;
- int used=,k=head[u];
- while(k){
- if (edge[k].v&&lev[edge[k].to]==lev[u]+){
- int w=dfs(edge[k].to,v,min(edge[k].v,f-used));
- used+=w;
- edge[k].v-=w;
- edge[k^].v+=w;
- if (used==f) return used;
- }
- k=edge[k].next;
- }
- return used;
- }
- int dinic(int s,int t){
- int flow=;
- while(bfs(s,t))
- flow+=dfs(s,t,inf);
- return flow;
- }
- void init(){
- n=in(),m=in(),d=in();
- for (int i=; i<=n; ++i){
- for (int j=; j<=m; ++j){
- int x=getchar()-'',no=getno(i,j);
- if (x) ins(no,no+n*m,x),ins(no+n*m,no,),b[i][j]=;
- }
- getchar();
- }
- for (register int i=; i<=n; ++i){
- for(register int j=; j<=m; ++j)
- if (getchar()=='L') ++mz,ins(,getno(i,j),),ins(getno(i,j),,);
- getchar();
- }
- for (register int i=; i<=n; ++i)
- for (register int j=; j<=m; ++j)
- if(b[i][j]){
- if (i-d<||i+d>n||j-d<||j+d>m) ins(getno(i,j)+n*m,n*m*+,inf),ins(n*m*+,getno(i,j)+n*m,);
- for (int k=(i-d<?:i-d); k<=(i+d>n?n:i+d); ++k)
- for (int t=(j-d<?:j-d); t<=(j+d>m?m:j+d); ++t)
- if (b[k][t]&&getdis(i,j,k,t)<=d&&(i!=k||j!=t))
- ins(getno(i,j)+n*m,getno(k,t),inf),ins(getno(k,t),getno(i,j)+n*m,);
- }
- }
- int main(){
- init();
- printf("%d",mz-dinic(,*n*m+));
- return ;
- }
本文由Melacau编写,Melacau代表M星向您问好,如果您不是在我的博客http://www.cnblogs.com/Melacau上看到本文,请您向我联系,email:13960948839@163.com.
【网络流】【BZOJ1006】【SCOI2007】蜥蜴的更多相关文章
- POJ 2711 Leapin' Lizards / HDU 2732 Leapin' Lizards / BZOJ 1066 [SCOI2007]蜥蜴(网络流,最大流)
POJ 2711 Leapin' Lizards / HDU 2732 Leapin' Lizards / BZOJ 1066 [SCOI2007]蜥蜴(网络流,最大流) Description Yo ...
- P2472 [SCOI2007]蜥蜴(网络流)
P2472 [SCOI2007]蜥蜴 把每个点拆成2个点,两点之间连边的边权为石柱高度 新建虚拟源点$S$和汇点$T$ $S$向所有有蜥蜴的点连边,边权1 其他边都连$inf$ 剩下就是裸的$dini ...
- BZOJ1066 SCOI2007 蜥蜴 【网络流-最大流】
BZOJ1066 SCOI2007 蜥蜴 Description 在一个r行c列的网格地图中有一些高度不同的石柱,一些石柱上站着一些蜥蜴,你的任务是让尽量多的蜥蜴逃到边界外. 每行每列中相邻石柱的距离 ...
- 题解 P2472 【[SCOI2007]蜥蜴】
P2472 [SCOI2007]蜥蜴 题目背景 07四川省选 题目描述 在一个r行c列的网格地图中有一些高度不同的石柱,一些石柱上站着一些蜥蜴,你的任务是让尽量多的蜥蜴逃到边界外. 每行每列中相邻石柱 ...
- [SCOI2007] 蜥蜴 (最大流)
[SCOI2007] 蜥蜴 题目背景 07四川省选 题目描述 在一个r行c列的网格地图中有一些高度不同的石柱,一些石柱上站着一些蜥蜴,你的任务是让尽量多的蜥蜴逃到边界外. 每行每列中相邻石柱的距离为1 ...
- P2472 [SCOI2007]蜥蜴(最大流)
P2472 [SCOI2007]蜥蜴 自己第一道独立做题且一遍AC的网络流题纪念... 看到这道题我就想到网络流建图的方式了... 首先根据每个高度,我们将每个点拆成两个点限流.之后根据跳的最大距离, ...
- 1066: [SCOI2007]蜥蜴
1066: [SCOI2007]蜥蜴 Time Limit: 1 Sec Memory Limit: 162 MBSubmit: 3545 Solved: 1771[Submit][Status] ...
- BZOJ 1066 POJ 2711 [SCOI2007]蜥蜴
与POJ 1815 Friendship类似,该题之前也做过 目前处于TLE状态.样例已经通过 1066: [SCOI2007]蜥蜴 Time Limit: 1 Sec Memory Limit: ...
- 【bzoj1066】[SCOI2007]蜥蜴 网络最大流
[bzoj1066][SCOI2007]蜥蜴 Description 在一个r行c列的网格地图中有一些高度不同的石柱,一些石柱上站着一些蜥蜴,你的任务是让尽量多的蜥蜴逃到边界外. 每行每列中相邻石柱的 ...
- BZOJ 1066: [SCOI2007]蜥蜴( 最大流 )
结点容量..拆点然后随便写 --------------------------------------------------------------- #include<cstdio> ...
随机推荐
- python控制流 If-else
控制流 If-else 我们处理现实生活中的问题时会做出决定,就像决定买哪种相机或者怎样更好的打篮球.同样我们写计算机程序的时候也要做相同的事情.我们通过 if-else 语句来做决定,我们使 ...
- io多路复用(一)
sever端 1 import socket sk1 = socket.socket() sk1.bind(('127.0.0.1',8001,)) sk1.listen() sk2 = socket ...
- AWS EC2服务器的HTTPS负载均衡器配置过程
AWS EC2服务器配置负载均衡器步骤: 1.普通负载均衡器 至少两台EC2实例,这里以Centos6.7系统为例 启动之后先安装个apache的httpd服务器默认80端口,或者使用其他服务 ...
- TOTP算法 基于时间的一次性密码
/** Copyright (c) 2011 IETF Trust and the persons identified as authors of the code. All rights rese ...
- .NET Core装饰模式和.NET Core的Stream
该文章综合了几本书的内容. 某咖啡店项目的解决方案 某咖啡店供应咖啡, 客户买咖啡的时候可以添加若干调味料, 最后要求算出总价钱. Beverage是所有咖啡饮料的抽象类, 里面的cost方法是抽象的 ...
- faster-rcnn 结构杂谈
faster-rcnn结构图: (只截取了最难理解的部分) 这个网络看似很复杂,但是理解了其中关键的层,就基本可以掌握这个结构了.要看源码!!要看源码!!要看源码 !!重要的事情说三遍. 关键的层: ...
- Gson解析Json数组
需求:从steam官网获取英雄数据,即为Json数据,并导入到本地数据库 Json数据是这样的 { "result": { "heroes": [ { &quo ...
- LAMP 搭建
p { margin-bottom: 0.25cm; line-height: 120% } LAMP 搭建 承 Ubuntu 17.10.1安装, 定制. 参考 电子工业出版社, Ubuntu完美应 ...
- WebApi 接口返回值类型详解 ( 转 )
使用过Webapi的园友应该都知道,Webapi的接口返回值主要有四种类型 void无返回值 IHttpActionResult HttpResponseMessage 自定义类型 此篇就围绕这四块分 ...
- Vue.js和jQuery混合使用的一点注意事项
首先,Vue 的官方是不建议直接操作 DOM 的,其优势在于视图和数据的双向绑定,而且所有DOM操作都可以用Vue实现,反而使用jQuery来操作DOM的话,会造成不必要的麻烦,DOM未渲染完成之前事 ...