bzoj 1066 蜥蜴(最大流)

2021-08-14 17:36:07 字數 1337 閱讀 5040

在乙個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...