P3380: [Usaco2004 Open]Cave Cows 1 洞穴里的牛之一

时间:2023-03-09 06:37:07
P3380: [Usaco2004 Open]Cave Cows 1 洞穴里的牛之一

还是蛮简单的一道题,首先dfs一遍,在所有能到达放有干草的洞穴的所有路径中,找出路径上最小伐值的最大值,按这个值由小到大,再来一遍贪心就行了,能放就放,不能放拉倒(也可以理解为,不能放把最前一个删了)。

但是如果题目改为每个洞穴不止一堆干草的话,也是没有问题的,只要在队列上在维护一个小根堆,判断队列中最小的干草堆是否比当前小,小则替换,否则不变。

 const maxn=;
type
node=record
f,t,w:longint;
end;
var n,i,j,m,k,u,v,x,now,ans:longint;
head:array[..] of longint;
b:array[..] of node;
f:array[..] of longint;
p:array[..] of boolean;
a:array[..] of longint;
max:array[..] of longint;
function min(a,b:longint):longint;
begin
if a>b then exit(b)
else exit(a);
end;
procedure insert(num,u,v,x:longint);
begin
b[num].f:=head[u];
b[num].t:=v;
b[num].w:=x;
head[u]:=num;
end;
procedure qs(t,w:longint);
var mid,l,r,tem:longint;
begin
l:=t; r:=w; mid:=max[a[(l+r) shr ]];
repeat
begin
while max[a[l]]<mid do inc(l);
while max[a[r]]>mid do dec(r);
if l<=r then
begin
tem:=a[l];
a[l]:=a[r];
a[r]:=tem;
inc(l);
dec(r);
end;
end;
until l>r;
if t<r then qs(t,r);
if l<w then qs(l,w);
end;
procedure bfs;
var now,nowe,l,r:longint;
begin
fillchar(max,sizeof(max),);
fillchar(p,sizeof(p),true);
l:=; r:=; f[]:=; max[]:=maxn;
while l<=r do
begin
now:=f[l];
nowe:=head[now];
while nowe<> do
begin
if min(max[now],b[nowe].w)>max[b[nowe].t] then
begin
max[b[nowe].t]:=min(max[now],b[nowe].w);
if p[b[nowe].t] then
begin
p[b[nowe].t]:=false;
inc(r);
f[r]:=b[nowe].t;
end;
end;
nowe:=b[nowe].f;
end;
inc(l);
p[now]:=true;
end;
end;
begin
readln(n,m,k);
for i:= to k do
readln(a[i]);
for i:= to m do
begin
readln(u,v,x);
insert(*i-,u,v,x);
insert(*i,v,u,x);
end;
bfs;
qs(,k);
now:=;
while (max[a[now]]=) and (now<=k) do inc(now); //q[1]:=now;
if now<>k+ then ans:=
else begin
writeln();
halt;
end;
for i:=now+ to k do
if max[a[i]]>ans then inc(ans);
writeln(ans);
end.

(转载请注明出处:http://www.cnblogs.com/Kalenda/)