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