BZOJ 1066 蜥蜴 網路流

2022-05-27 01:09:09 字數 1851 閱讀 3964

很普通的拆點網路流,把每個柱子拆成兩個點(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).

跑一遍最大流,答案就是總蜥蜴數-最大流。

# include # include 

# include

# include

# include

# include

# include

# include

# include

# include

# include

using

namespace

std;

# define lowbit(x) ((x)&(-x))

# define pi acos(-1.0

)# define eps 1e-9

# define mod

12345678

# define inf

1000000000

# define mem(a,b) memset(a,b,

sizeof

(a))

# define for(i,a,n)

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

# define fo(i,a,n)

for(int i=a; ii)

# define bug puts("h

");# define lch p

<<1

,l,mid

# define rch p

<<1|1,mid+1

,r# define mp make_pair

# define pb push_back

typedef pair

pii;

typedef vector

vi;# pragma comment(linker,

"/stack:1024000000,1024000000")

typedef

long

long

ll;int

scan()

void out(int

a)

if(a>=10) out(a/10

); putchar(a%10+'0'

);}const

int n=2005;//

code begin...

struct edgeedge[650005

];int head[805], cnt=2, s, t, vis[805

];char s1[25][25], s2[25][25

];queue

q;void add_edge(int u, int v, int

w)int bfs(void

) }

}return vis[t]!=-1;}

int dfs(int x, int

low)

}if (temp==low) vis[x]=-1

;

return low-temp;

}int

main ()

}int res=0

, temp;

while (bfs()) while (temp=dfs(s,inf)) res+=temp;

printf(

"%d\n

",sum-res);

return0;

}

view code

BZOJ1066 蜥蜴 做題筆記

做這題的時候被自己打的模板坑了,查了好久好久都沒查出錯。以後做題也不能過分信任某一段 而不去查它的錯了。恩,這題的背景總讓人想起科學的上網。這題的距離是指歐幾里得距離,就是sqrt x1 x2 2 y1 y2 2 我之前竟然沒有見過,按照上下左右還有對角線去遍歷,結果顯而易見。include inc...

bzoj 1066 蜥蜴(最大流)

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

BZOJ1066 SCOI2007蜥蜴 最大流

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