BZOJ1066 SCOI2007 蜥蜴


Description

  在一个r行c列的网格地图中有一些高度不同的石柱,一些石柱上站着一些蜥蜴,你的任务是让尽量多的蜥蜴逃到边界外。 每行每列中相邻石柱的距离为1,蜥蜴的跳跃距离是d,即蜥蜴可以跳到平面距离不超过d的任何一个石柱上。石柱都不稳定,每次当蜥蜴跳跃时,所离开的石柱高度减1(如果仍然落在地图内部,则到达的石柱高度不变),如果该石柱原来高度为1,则蜥蜴离开后消失。以后其他蜥蜴不能落脚。任何时刻不能有两只蜥蜴在同一个石柱上。

Input

  输入第一行为三个整数r,c,d,即地图的规模与最大跳跃距离。以下r行为石竹的初始状态,0表示没有石柱,1~3表示石柱的初始高度。以下r行为蜥蜴位置,“L”表示蜥蜴,“.”表示没有蜥蜴。

Output

  输出仅一行,包含一个整数,即无法逃离的蜥蜴总数的最小值。

Sample Input

5 8 2

00000000

02000000

00321100

02000000

00000000

……..

……..

..LLLL..

……..

……..

Sample Output

1

HINT

100%的数据满足:1<=r, c<=20, 1<=d<=4


一道比较裸的(套路)最大流板子

把一个石柱点分成进和出两个部分,中间连一条容量为高度的边

然后就可以做完了


//yangkai
#include<bits/stdc++.h>
using namespace std;
#define INF 0x3f3f3f3f
#define N 10010
struct Edge{int u,v,cap,flow;};
struct Dinic{
int s,t;
int vis[N],d[N];
vector<Edge> E;
vector<int> G[N];
void add(int u,int v,int cap){
E.push_back((Edge){u,v,cap,0});
E.push_back((Edge){v,u,0,0});
int cnt=E.size();
G[u].push_back(cnt-2);
G[v].push_back(cnt-1);
}
bool BFS(){
memset(vis,0,sizeof(vis));
memset(d,0,sizeof(d));
queue<int> Q;
Q.push(s);
vis[s]=1;
while(!Q.empty()){
int u=Q.front();Q.pop();
for(int i=0;i<G[u].size();i++){
Edge &e=E[G[u][i]];
if(!vis[e.v]&&e.cap>e.flow){
vis[e.v]=1;
d[e.v]=d[u]+1;
Q.push(e.v);
}
}
}
return vis[t];
}
int DFS(int u,int a){
if(u==t||!a)return a;
int flow=0;
for(int i=0;i<G[u].size();i++){
Edge &e=E[G[u][i]];
if(d[e.v]!=d[u]+1)continue;
int f=DFS(e.v,min(a,e.cap-e.flow));
e.flow+=f;
E[G[u][i]^1].flow-=f;
flow+=f;
a-=f;
if(!a)break;
}
return flow;
}
int Maxflow(){
int flow=0;
while(BFS())
flow+=DFS(s,INF);
return flow;
}
}dinic;
int w,h,d,sum=0;
int g[30][30],p[30][30];
char op[30];
bool judge_in(int x1,int x2,int y1,int y2){
return (x1-x2)*(x1-x2)+(y1-y2)*(y1-y2)<=d*d;
}
int getid(int x,int y){
return (x-1)*h+y;
}
void build(){
dinic.s=0;dinic.t=w*h*2+1;
for(int i=1;i<=w;i++)
for(int j=1;j<=h;j++)
if(p[i][j])dinic.add(dinic.s,getid(i,j)*2-1,1);
for(int i=1;i<=w;i++)
for(int j=1;j<=h;j++)
if(i<=d||i>=(w-d+1)||j<=d||j>=(h-d+1))
dinic.add(getid(i,j)*2,dinic.t,INF);
for(int i=1;i<=w;i++)
for(int j=1;j<=h;j++)
for(int ii=1;ii<=w;ii++)
for(int jj=1;jj<=h;jj++)
if(judge_in(i,ii,j,jj))
dinic.add(getid(i,j)*2,getid(ii,jj)*2-1,INF);
for(int i=1;i<=w;i++)
for(int j=1;j<=h;j++)
if(g[i][j])dinic.add(getid(i,j)*2-1,getid(i,j)*2,g[i][j]);
}
int main(){
cin>>w>>h>>d;
for(int i=1;i<=w;i++){
scanf("%s",op+1);
for(int j=1;j<=h;j++)g[i][j]=op[j]-'0';
}
for(int i=1;i<=w;i++){
scanf("%s",op+1);
for(int j=1;j<=h;j++){
p[i][j]=(op[j]=='L')?1:0;
sum+=p[i][j];
}
}
build();
cout<<sum-dinic.Maxflow();
return 0;
}

BZOJ1066 SCOI2007 蜥蜴 【网络流-最大流】的更多相关文章

  1. BZOJ1066 [SCOI2007]蜥蜴 网络流 最大流 SAP

    由于本题和HDU2732几乎相同,所以读者可以看-> HDU2732题解传送门: http://www.cnblogs.com/zhouzhendong/p/8362002.html

  2. bzoj1066: [SCOI2007]蜥蜴(最大流)

    1066: [SCOI2007]蜥蜴 题目:传送门 题解: 哇QTT大佬一眼秒算法...ORT 其实很容易就可以看出来是一道最大流 因为有边的使用限制,那么就可以直接当成是流量来处理嘛 因为是对点进行 ...

  3. [bzoj1066] [SCOI2007] 蜥蜴 - 网络流

    在一个r行c列的网格地图中有一些高度不同的石柱,一些石柱上站着一些蜥蜴,你的任务是让尽量多的蜥蜴逃到边界外. 每行每列中相邻石柱的距离为1,蜥蜴的跳跃距离是d,即蜥蜴可以跳到平面距离不超过d的任何一个 ...

  4. 【bzoj1066】[SCOI2007]蜥蜴 网络最大流

    [bzoj1066][SCOI2007]蜥蜴 Description 在一个r行c列的网格地图中有一些高度不同的石柱,一些石柱上站着一些蜥蜴,你的任务是让尽量多的蜥蜴逃到边界外. 每行每列中相邻石柱的 ...

  5. 【bzoj1066】: [SCOI2007]蜥蜴 图论-最大流

    [bzoj1066]: [SCOI2007]蜥蜴 把石柱拆点,流量为高度 然后S与蜥蜴连流量1的边 互相能跳到的石柱连inf的边 石柱能到边界外的和T连inf的边 然后跑dinic就好了 /* htt ...

  6. P2472 [SCOI2007]蜥蜴(最大流)

    P2472 [SCOI2007]蜥蜴 自己第一道独立做题且一遍AC的网络流题纪念... 看到这道题我就想到网络流建图的方式了... 首先根据每个高度,我们将每个点拆成两个点限流.之后根据跳的最大距离, ...

  7. bzoj千题计划135:bzoj1066: [SCOI2007]蜥蜴

    http://www.lydsy.com/JudgeOnline/problem.php?id=1066 每个柱子拆成两个点 i<<1,i<<1|1,之间连流量为高度的边 如果 ...

  8. 【BZOJ】1066: [SCOI2007]蜥蜴(最大流)

    http://www.lydsy.com/JudgeOnline/problem.php?id=1066 本题想一想应该懂了的. 我们想啊,,每个点都有限制,每个点都可以跳到另一个有限制的点,每个有蜥 ...

  9. BZOJ1066 [SCOI2007]蜥蜴

    首先...这是道(很水的)网络流 我们发现"每个时刻不能有两个蜥蜴在同一个柱子上"这个条件是没有用的因为可以让外面的先跳,再让里面的往外跳 但是还有柱子高度的限制,于是把柱子拆点为 ...

随机推荐

  1. C# 同步调用、异步调用、异步回调

    本文将主要通过“同步调用”.“异步调用”.“异步回调”三个示例来讲解在用委托执行同一个“加法类”的时候的的区别和利弊. 首先,通过代码定义一个委托和下面三个示例将要调用的方法: public dele ...

  2. js删除数组中某一项或几项的几种方法

    1:js中的splice方法 splice(index,len,[item])    注释:该方法会改变原始数组. splice有3个参数,它也可以用来替换/删除/添加数组内某一个或者几个值 inde ...

  3. Servlet之监听事件细究

    观察者三个模式: ServletContextListener:用于监听WEB 应用启动和销毁的事件,监听器类需要实现javax.servlet.ServletContextListener 接口. ...

  4. vim 删除多列

    比如想删除一个文件的1-1000行的前3列: gg #到文件首ctrl+v #可视块模式999j,2l #注意是小写的J和L(方向键向下和向右也可以)d #删除

  5. Codeforces Round #400

    最近好像总是有点不想打,专题也刷不动,还是坚持这做了一场,虽然打到一半就没打了...(反正通常都只能做出两题) 感觉自己切水题越来越熟练了,然而难题还是不会做.. A题,水,用vector存下来就行了 ...

  6. python 细节回顾

    #!/usr/bin/python # -*- coding: UTF-8 -*- for letter in 'Python': # 第一个实例 if letter == 'h': continue ...

  7. WebApplication和WebSite的简单区别

    初步认识网站和网站应用程序区别 1. 网页头部文件 网站 <%@ Page Language="VB" AutoEventWireup="false" C ...

  8. 2: 使用Prism初始化程序 Initializing Applications Using the Prism Library 5.0 for WPF(英汉对照版)

    This topic addresses what needs to happen to get a Prism for WPF application up and running. A Prism ...

  9. 一、html <!doctype>标签

    一.html <!doctype>标签 定义和用法 <!DOCTYPE> 声明必须是 HTML 文档的第一行,位于 <html> 标签之前. <!DOCTYP ...

  10. Webstorm常用快捷键大全

    webstorm应该是目前最强的js编辑器了,结合sublime text可以很效率的开发项目.今天整理了一些webstorm比较实用的快捷键: Ctrl+/ 或 Ctrl+Shift+/ 注释(// ...