蜥蜴
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

分析:

由于每个柱子能经过蜥蜴的次数有限,可将一个柱子拆为两个点Ai,Bi,从Bi到Ai连一条边,容量为柱子高度。如果柱子j与i距离符合要求,就连一条Ai到Bj容量无限的边,如果一开始该柱子上有蜥蜴就从源点连一条容量为1的边指向柱子i,如果柱子i到边界距离不超过d就向汇点连一条容量无限的边,跑一遍dinic后用蜥蜴数减最大流即为答案。

代码:

program work;
var
f,map:array[..,..]of longint;
q:array[..]of longint;
a,b,c,h:array[..]of longint;
n,i,m,j,s,t,d,ans,k,v,flow:longint;
ch:char;
function min(x,y:longint):longint;
begin
if x<y then min:=x else min:=y;
end;
function bfs:boolean;
var l,r,x,i:longint;
begin
fillchar(h,sizeof(h),);
l:=; r:=;
q[]:=s;h[s]:=;
while l<r do
begin
inc(l); x:=q[l];
for i:= to t do
if (f[x,i]>)and(h[i]=) then
begin
h[i]:=h[x]+; inc(r);q[r]:=i;
end;
end;
if h[t]= then exit(false) else exit(true);
end;
function dfs(x,flow:longint):longint;
var d,i:longint;
begin
if x=t then exit(flow);
for i:= to t do
if (h[i]=h[x]+)and(f[x,i]>) then
begin
d:=dfs(i,min(f[x,i],flow));
if d<> then
begin
inc(f[i,x],d);dec(f[x,i],d);exit(d);
end;
end;
exit();
end;
begin
readln(n,m,d);fillchar(f,sizeof(f),);
for i:= to n do begin
for j:= to m do
begin
read(ch);
if ch<>'' then begin inc(t); a[t]:=i; b[t]:=j;c[t]:=ord(ch)-; map[i,j]:=t;end;
end; readln; end;
for i:= to n do begin
for j:= to m do
begin
read(ch); if ch='L' then begin f[,t+map[i,j]]:=; inc(k); end;
end; readln; end;
for i:= to t do
begin
f[i+t,i]:=c[i];
for j:= to t do
if j<>i then
begin
if sqr(a[i]-a[j])+sqr(b[i]-b[j])<=d*d then f[i,j+t]:=k;
end;
if (a[i]-d<=)or(a[i]+d>n)or(b[i]-d<=)or(b[i]+d>m) then f[i,t*+]:=k;
end;
ans:=; s:=; t:=t*+;
while bfs do
begin
flow:=dfs(s,maxlongint div );
while flow<> do
begin
inc(ans,flow); flow:=dfs(s,maxlongint div );
end;
end;
writeln(k-ans);
end.

BZOJ 1066:[SCOI2007]蜥蜴(最大流)的更多相关文章

  1. BZOJ 1066: [SCOI2007]蜥蜴( 最大流 )

    结点容量..拆点然后随便写 --------------------------------------------------------------- #include<cstdio> ...

  2. poj 2711 Leapin' Lizards && BZOJ 1066: [SCOI2007]蜥蜴 最大流

    题目链接:http://poj.org/problem?id=2711 题目链接:http://www.lydsy.com/JudgeOnline/problem.php?id=1066 Your p ...

  3. POJ 2711 Leapin' Lizards / HDU 2732 Leapin' Lizards / BZOJ 1066 [SCOI2007]蜥蜴(网络流,最大流)

    POJ 2711 Leapin' Lizards / HDU 2732 Leapin' Lizards / BZOJ 1066 [SCOI2007]蜥蜴(网络流,最大流) Description Yo ...

  4. [BZOJ 1066] [SCOI2007] 蜥蜴 【最大流】

    题目链接:BZOJ - 1066 题目分析 题目限制了高度为 x 的石柱最多可以有 x 只蜥蜴从上面跳起,那么就可以用网络流中的边的容量来限制.我们把每个石柱看作一个点,每个点拆成 i1, i2,从 ...

  5. BZOJ 1066 [SCOI2007]蜥蜴(最大流)

    [题目链接] http://www.lydsy.com/JudgeOnline/problem.php?id=1066 [题目大意] 在一个r行c列的网格地图中有一些高度不同的石柱,一些石柱上站着一些 ...

  6. bzoj 1066: [SCOI2007] 蜥蜴

    这道题还是挺好想的,但我一开始还是想错了…… 把每个石柱拆成两个点,一个入度,一个出度,两个点连一条容量为高度的边,这样就可以限制从此石柱上经过的蜥蜴的数量.关于蜥蜴是否单独成点,我是单独当成了一个点 ...

  7. bzoj 1066 : [SCOI2007]蜥蜴 网络流

    题目链接 给一个n*m的图, 里面每一个点代表一个石柱, 石柱有一个高度. 初始时有些石柱上面有蜥蜴, 蜥蜴可以跳到距离他曼哈顿距离小于等于d的任意一个石柱上,跳完后, 他原来所在的石柱高度会减一, ...

  8. 1066: [SCOI2007]蜥蜴

    1066: [SCOI2007]蜥蜴 Time Limit: 1 Sec  Memory Limit: 162 MBSubmit: 3545  Solved: 1771[Submit][Status] ...

  9. [SCOI2007] 蜥蜴 (最大流)

    [SCOI2007] 蜥蜴 题目背景 07四川省选 题目描述 在一个r行c列的网格地图中有一些高度不同的石柱,一些石柱上站着一些蜥蜴,你的任务是让尽量多的蜥蜴逃到边界外. 每行每列中相邻石柱的距离为1 ...

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

    题目 P2472 [SCOI2007]蜥蜴 解析 这个题思路比较清晰,本(qi)来(shi)以(jiu)为(shi)无脑建图跑最大流,结果挂了,整了一个小时后重新建图才过的. 建立一个超级源点和一个超 ...

随机推荐

  1. 在SQL SERVER中批量替换字符串的方法

    UPDATE MainData SET Content = )) , 'XM00000137' , 'XM00000078') WHERE [Key] IN (SELECT md_key FROM i ...

  2. c++ 时间函数和结构化数据

     time和localtime  数据结构概念  struct关键字  认识数据结构  自定义结构 例:获取当前系统日期和时间;(代码例子) 一.函数: time 函数time()返回的是当 ...

  3. slqite3练习

    连接 import sqlite3 con = sqlite3.connect(":memory:") c = con.cursor() # Create table c.exec ...

  4. 【Loj10222】佳佳的Fibonacci

    题面 题解 可以发现\(T(n)\)无法用递推式表示. 于是我们做如下变形: \[ T(n) = \sum _ {i = 1} ^ n i \times f_i \\ S(n) = \sum _ {i ...

  5. 【LG4491】[HAOI2018]染色

    [LG4491][HAOI2018]染色 题面 洛谷 题解 颜色的数量不超过\(lim=min(m,\frac nS)\) 考虑容斥,计算恰好出现\(S\)次的颜色至少\(i\)种的方案数\(f[i] ...

  6. 【LG2257】YY的GCD

    [LG2257]YY的GCD 题面 洛谷 题解 题目大意: 给定\(n,m\)求\(\sum_{i=1}^{n}\sum_{j=1}^{m}[gcd(i,j)为质数]\). 我们设\(f(x)=[x为 ...

  7. 10_SpringBoot集成TkMybatis插件

    10_SpringBoot集成TkMybatis插件 明天你好向前奔跑 关注  0.5 2018.09.11 11:15 字数 163 阅读 3794评论 0喜欢 3 @Author Jacky Wa ...

  8. 【word基础】如何取消word首字母大写

  9. this指向问题(箭头函数没有this)

    全局环境下,指向windows console.log(this.document === document); // true 函数上下文调用 function f1(){ return this; ...

  10. python-python爬取妹子图片

    # -*- conding=utf-8 -*- import requests from bs4 import BeautifulSoup import io url = "https:// ...