題解 P2472 SCOI2007 蜥蜴

2022-05-05 20:09:13 字數 2127 閱讀 9357

題目背景

07四川省選

題目描述

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

每行每列中相鄰石柱的距離為1,蜥蜴的跳躍距離是d,即蜥蜴可以跳到平面距離不超過d的任何乙個石柱上。石柱都不穩定,每次當蜥蜴跳躍時,所離開的石柱高度減1(如果仍然落在地圖內部,則到達的石柱高度不變),如果該石柱原來高度為1,則蜥蜴離開後消失。以後其他蜥蜴不能落腳。任何時刻不能有兩隻蜥蜴在同乙個石柱上。

輸入輸出格式

輸入格式:

輸入第一行為三個整數r,c,d,即地圖的規模與最大跳躍距離。以下r行為石竹的初始狀態,0表示沒有石柱,1~3表示石柱的初始高度。以下r行為蜥蜴位置,「l」表示蜥蜴,「.」表示沒有蜥蜴。

輸出格式:

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

解決這題的關鍵是理解這句話:石柱都不穩定,每次當蜥蜴跳躍時,所離開的石柱高度減1(如果仍然落在地圖內部,則到達的石柱高度不變),如果該石柱原來高度為1,則蜥蜴離開後消失

我們把這句話轉換一下,每個石柱 \(i\) 可以用石柱高度 \(hi\) 次。這是乙個限制條件:使用次數,所以我們想到了最大流。

不能逃脫的蜥蜴數即為總蜥蜴數 - 逃脫的蜥蜴數,所以我們現在思考怎麼建圖

最大流的核心在於限制

由限制條件,對網路流模型極其敏感我們可知道:石柱一定是要拆成兩個點的,兩點之間邊容量為石柱高度 \(h\) ,這樣可以限制乙個石柱只能跳 \(h\) 次

由最大流答案不可能大於蜥蜴總數,所以我們可以聯想到由匯點向蜥蜴所在的石柱連邊,容量為 1

由石柱之間在規定距離內可以相互到達,傻子都會我們可以在距離內的石柱連一條容量為inf的邊

由要跳出去可得:在跳到外圍距離小於d的石柱連一條容量為inf的邊

注意:因為每次都要消耗石柱高度,所以連入石柱的邊連 石柱1 ,連出石柱的邊從 石柱2 出發,從而達到路過石柱消耗高度這一限制

#include#include#include#include#include#define ll long long

using namespace std;

int rd()

while(c >= '0' && c <= '9')

return flag * out;

}const int maxn = 100019,inf = 1e9;

int num,nume = 1,tot;

int lenx,leny,d;

int map[190][190];

int l[190][190];

int s,t,maxflow;

int head[maxn];

struct nodee[maxn << 2];

void add(int u,int v,int dis)

int lev[maxn];

bool bfs()}}

return 0;

}int dinic(int u,int flow)

}return flow - rest;

}double getdis(int x1,int y1,int x2,int y2)

int getindex(int x,int y)

int main()

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

//石頭1部從1到tot(lenx * leny),2部 + tot,石頭編號為(i - 1) * leny + j

tot = lenx * leny;

s = tot * 2 + 1,t = s + 1;

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

if(l[i][j])}}

}for(int x1 = 1;x1 <= lenx;x1++)}}

}}

int flow = 0;

while(bfs())while(flow = dinic(s,inf))maxflow += flow;

printf("%d\n",num - maxflow);

return 0;

}

洛谷P2472 SCOI2007 蜥蜴 題解

這道題用最大流解決。首先構建模型。一根柱子可以跳入和跳出,於是拆成兩個點 入點和出點。每一根柱子的入點和出點連一條流量為高度的邊,來限制蜥蜴跳入的次數。當柱子a可以調到柱子b時,就從a的出點向b的入點連邊,流量inf。s向所有有蜥蜴的柱子的入點連邊,流量為1 t表示地圖外一點,當一根柱子能跳到地圖外...

洛谷P2472 SCOI2007 蜥蜴 題解

這道題用最大流解決。首先構建模型。一根柱子可以跳入和跳出,於是拆成兩個點 入點和出點。每一根柱子的入點和出點連一條流量為高度的邊,來限制蜥蜴跳入的次數。當柱子a可以調到柱子b時,就從a的出點向b的入點連邊,流量inf。s向所有有蜥蜴的柱子的入點連邊,流量為1 t表示地圖外一點,當一根柱子能跳到地圖外...

P2472 SCOI2007 蜥蜴 網路流

n m n mn m個格仔,每個格仔的石柱高度不同,蜥蜴可以跳到距離不超過d dd的石柱處,並且先前所站的石柱高度減一,為0則不能站,然後求有多少只蜥蜴不可以逃脫。考慮網路流,每只蜥蜴表示乙個流,將每個石柱分成入點和出點,然 點連出點流量為石柱高度,然後每個可以走的點之間出點連入點無限,之後有蜥蜴的...