P2472 SCOI2007 蜥蜴(最大流)

2022-05-01 04:15:08 字數 1320 閱讀 7801

自己第一道獨立做題且一遍ac的網路流題紀念...

看到這道題我就想到網路流建圖的方式了...

首先根據每個高度,我們將每個點拆成兩個點限流.之後根據跳的最大距離,連邊,最後能跳出邊界的與t連邊,跑最大流即可...

突然發現最大流與網格圖好像有著某種聯絡...

#include#define ll long long

using

namespace

std;

const

int n=21,inf=1e9;

int h[n][n],n,m,l,s,t,link[n*n*2],tot=1,d[n*n*2],current[n*n*2

],cnt;

struct edgea[n*n*n*n*2

];inline

intread()

while(isdigit(ch))

return x*ff;

}inline

void add(int x,int y,int

v)inline

double dis(int x1,int y1,int x2,int

y2)inline

bool

bfs()

}return

false;}

inline

int dinic(int x,int

flow)

}return flow-rest;

}int

main()

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

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

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

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

for(int x=max(1,i-l);x<=min(n,i+l);++x)

for(int y=max(1,j-l);y<=min(m,j+l);++y)

if(dis(i,j,x,y)<=l) add((i-1)*m+j+n*m,(x-1)*m+y,inf);

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

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

if(i<=l||n-i1)*m+j+n*m,t,inf);

int maxflow=0

,flow;

while

(bfs())

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

printf("%d

",cnt-maxflow);

return0;

}

view code

題解 P2472 SCOI2007 蜥蜴

題目背景 07四川省選 題目描述 在乙個r行c列的網格地圖中有一些高度不同的石柱,一些石柱上站著一些蜥蜴,你的任務是讓盡量多的蜥蜴逃到邊界外。每行每列中相鄰石柱的距離為1,蜥蜴的跳躍距離是d,即蜥蜴可以跳到平面距離不超過d的任何乙個石柱上。石柱都不穩定,每次當蜥蜴跳躍時,所離開的石柱高度減1 如果仍...

P2472 SCOI2007 蜥蜴 網路流

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

洛谷P2472 SCOI2007 蜥蜴 題解

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