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

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

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

 1 const maxn=200;
 2 type
 3   node=record
 4     f,t,w:longint;
 5   end;
 6 var n,i,j,m,k,u,v,x,now,ans:longint;
 7 head:array[0..101] of longint;
 8 b:array[0..2001] of node;
 9 f:array[0..100000] of longint;
10 p:array[0..101] of boolean;
11 a:array[0..15] of longint;
12 max:array[0..101] of longint;
13 function min(a,b:longint):longint;
14 begin
15   if a>b then exit(b)
16     else exit(a);
17 end;
18 procedure insert(num,u,v,x:longint);
19 begin
20   b[num].f:=head[u];
21   b[num].t:=v;
22   b[num].w:=x;
23   head[u]:=num;
24 end;
25 procedure qs(t,w:longint);
26 var mid,l,r,tem:longint;
27 begin
28   l:=t; r:=w; mid:=max[a[(l+r) shr 1]];
29   repeat
30     begin
31       while max[a[l]]<mid do inc(l);
32       while max[a[r]]>mid do dec(r);
33       if l<=r then
34         begin
35           tem:=a[l];
36           a[l]:=a[r];
37           a[r]:=tem;
38           inc(l);
39           dec(r);
40         end;
41     end;
42   until l>r;
43   if t<r then qs(t,r);
44   if l<w then qs(l,w);
45 end;
46 procedure bfs;
47 var now,nowe,l,r:longint;
48 begin
49   fillchar(max,sizeof(max),0);
50   fillchar(p,sizeof(p),true);
51   l:=1; r:=1; f[1]:=1; max[1]:=maxn;
52   while l<=r do
53     begin
54       now:=f[l];
55       nowe:=head[now];
56       while nowe<>0 do
57         begin
58           if min(max[now],b[nowe].w)>max[b[nowe].t] then
59             begin
60               max[b[nowe].t]:=min(max[now],b[nowe].w);
61               if p[b[nowe].t] then
62                 begin
63                   p[b[nowe].t]:=false;
64                   inc(r);
65                   f[r]:=b[nowe].t;
66                 end;
67             end;
68           nowe:=b[nowe].f;
69         end;
70       inc(l);
71       p[now]:=true;
72     end;
73 end;
74 begin
75   readln(n,m,k);
76   for i:=1 to k do
77     readln(a[i]);
78   for i:=1 to m do
79     begin
80       readln(u,v,x);
81       insert(2*i-1,u,v,x);
82       insert(2*i,v,u,x);
83     end;
84   bfs;
85   qs(1,k);
86   now:=1;
87   while (max[a[now]]=0) and (now<=k) do inc(now); //q[1]:=now;
88   if now<>k+1 then ans:=1
89     else begin
90       writeln(0);
91       halt;
92     end;
93   for i:=now+1 to k do
94     if max[a[i]]>ans then inc(ans);
95   writeln(ans);
96 end.
View Code

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

转载于:https://www.cnblogs.com/Kalenda/p/4830489.html

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值