題解 bzoj1066 SCOI2007 蜥蜴

2021-07-27 03:36:28 字數 1554 閱讀 5739

在乙個r行c列的網格地圖中有一些高度不同的石柱,一些石柱上站著一些蜥蜴,你的任務是讓盡量多的蜥蜴逃

到邊界外。 每行每列中相鄰石柱的距離為1,蜥蜴的跳躍距離是d,即蜥蜴可以跳到平面距離不超過d的任何乙個石

柱上。石柱都不穩定,每次當蜥蜴跳躍時,所離開的石柱高度減1(如果仍然落在地圖內部,則到達的石柱高度不

變),如果該石柱原來高度為1,則蜥蜴離開後消失。以後其他蜥蜴不能落腳。任何時刻不能有兩隻蜥蜴在同乙個

石柱上。

輸入第一行為三個整數r,c,d,即地圖的規模與最大跳躍距離。以下r行為石竹的初始狀態,0表示沒有石柱

,1~3表示石柱的初始高度。以下r行為蜥蜴位置,「l」表示蜥蜴,「.」表示沒有蜥蜴。

輸出僅一行,包含乙個整數,即無法逃離的蜥蜴總數的最小值。

5 8 2

00000000

02000000

00321100

02000000

00000000

........

........

..llll..

........

........

1100%的資料滿足:1<=r, c<=20, 1<=d<=4

這道題是經典的網路最大流。構建源點和匯點,源點向有蜥蜴的柱子連邊權為1的邊,將柱子拆成兩個點和一條帶權有向邊來控制流量(跳過的蜥蜴量),距離不超過d的柱子直接連雙向的權為無限大的邊。所有能跳出地圖的柱子向匯點連邊權為無限大的邊。然後跑一遍最大流就得到了能跳出去的蜥蜴數量,用蜥蜴總數減去就好了。

**:

#include#include#include#define inf 0x7fffffff

using namespace std;

struct datae[500001];

int r,c,d,cnt=1,ans,mp[21][21],mark[21][21],que[802],dep[802],head[802];

void ins(int u,int v,int w)

void insert(int u,int v,int w)

bool judge(int x1,int y1,int x2,int y2)

void build()

bool bfs()}}

return false;

}int dfs(int x,int flow)

}return 0;

}void dinic()

int main()

int tot=0;

for(int i=1;i<=r;i++)

for(int j=1;j<=c;j++)

for(int i=1;i<=r;i++)

}for(int i=1;i<=d;i++)

for(int j=d+1;j<=r-d;j++)

for(int i=1;i<=d;i++)

for(int j=1;j<=c;j++)

build();

dinic();

printf("%d\n",ans);

return 0;

}

BZOJ1066 SCOI2007蜥蜴 最大流

挺顯然的最大流,源向所有有蜥蜴的點連inf邊,所有點拆成入點和出點,入店向出點連流量為高度的邊,限制流量,所有可以一步跳出去的點向匯連inf邊,跑最大流就行了。include include include define inf 99999999 define maxn 1005 using nam...

題解 bzoj1297 SCOI2009 迷路

windy在有向圖中迷路了。該有向圖有 n 個節點,windy從節點 0 出發,他必須恰好在 t 時刻到達節點 n 1。現在給出該有向圖,你能告訴windy總共有多少種不同的路徑嗎?注意 windy不能在某個節點逗留,且通過某有向邊的時間嚴格為給定的時間。第一行包含兩個整數,n t。接下來有 n 行...

BZOJ4571 SCOI2016 美味 題解

一家餐廳有 n 道菜,編號 1.n 大家對第 i 道菜的評價值為 ai 1 i n 有 m 位顧客,第 i 位顧客的期望值為 bi,而他的偏好值為 xi 因此,第 i 位顧客認為第 j 道菜的美味度為 bi xor aj xi xor 表示異或運算。第 i 位顧客希望從這些菜中挑出他認為最美味的菜,...