在乙個r行c列的網格地圖中有一些高度不同的石柱,一些石柱上站著一些蜥蜴,你的任務是讓盡量多的蜥蜴逃
到邊界外。 每行每列中相鄰石柱的距離為1,蜥蜴的跳躍距離是d,即蜥蜴可以跳到平面距離不超過d的任何乙個石
柱上。石柱都不穩定,每次當蜥蜴跳躍時,所離開的石柱高度減1(如果仍然落在地圖內部,則到達的石柱高度不
變),如果該石柱原來高度為1,則蜥蜴離開後消失。以後其他蜥蜴不能落腳。任何時刻不能有兩隻蜥蜴在同乙個
石柱上。
input
輸入第一行為三個整數r,c,d,即地圖的規模與最大跳躍距離。以下r行為石竹的初始狀態,0表示沒有石柱
,1~3表示石柱的初始高度。以下r行為蜥蜴位置,「l」表示蜥蜴,「.」表示沒有蜥蜴。
output
輸出僅一行,包含乙個整數,即無法逃離的蜥蜴總數的最小值。
sample input
5 8 2
..llll..
sample output
hint
100%的資料滿足:1<=r, c<=20, 1<=d<=4
網路流經典題。建圖時,把每根柱子拆成兩個點,分別表示入和出。入點和出點之間用柱子的高度限流。把能互相到達的柱子連一條流量為inf的弧,再把能讓蜥蜴跳出地圖的柱子連一條到匯點流量為inf的弧,把源點連向所有一開始有蜥蜴的柱子,流量為inf。跑一遍最大流就是能跳出地圖的蜥蜴的最大數目,用蜥蜴總數減去即可。
#include
#define s (2*n*m+1)
#define t (2*n*m+2)
using
namespace
std;
const
int inf=1e9;
int n,m,d,num;
char a[25][25];
int head[1005],nex[50005],to[50005],cap[50005],tp=1;
int fir[1005],dep[1005];
void add(int x,int y,int z)
int dfs(int x,int now)
return c;
}int bfs()}}
return dep[t];
}int dinic()
return c;
}int main()}}
}}
for(int i=1;i<=n;++i) scanf("%s",a[i]+1);
for(int i=1;i<=n;++i)}}
printf("%d",num-dinic());
return
0;}
BZOJ1066 蜥蜴 做題筆記
做這題的時候被自己打的模板坑了,查了好久好久都沒查出錯。以後做題也不能過分信任某一段 而不去查它的錯了。恩,這題的背景總讓人想起科學的上網。這題的距離是指歐幾里得距離,就是sqrt x1 x2 2 y1 y2 2 我之前竟然沒有見過,按照上下左右還有對角線去遍歷,結果顯而易見。include inc...
BZOJ 1066 蜥蜴 網路流
很普通的拆點網路流,把每個柱子拆成兩個點 i,j,0 和 i,j,1 對於柱子的高度限制則加邊 i,j,0 i,j,1 height 兩個柱子能互相到達則加邊 i,j,1 i1,j1,0 inf 能到達邊界的柱子加邊 i,j,1 t,inf 有蜥蜴的柱子加邊 s,i,j,0 1 跑一遍最大流,答案就...
BZOJ1066 SCOI2007蜥蜴 最大流
挺顯然的最大流,源向所有有蜥蜴的點連inf邊,所有點拆成入點和出點,入店向出點連流量為高度的邊,限制流量,所有可以一步跳出去的點向匯連inf邊,跑最大流就行了。include include include define inf 99999999 define maxn 1005 using nam...