題目背景
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則不能站,然後求有多少只蜥蜴不可以逃脫。考慮網路流,每只蜥蜴表示乙個流,將每個石柱分成入點和出點,然 點連出點流量為石柱高度,然後每個可以走的點之間出點連入點無限,之後有蜥蜴的...