首页 > 代码库 > 1509: [NOI2003]逃学的小孩 - BZOJ

1509: [NOI2003]逃学的小孩 - BZOJ

Description


Input

第一行是两个整数N(3 ? N ? 200000)和M,分别表示居住点总数和街道总数。以下M行,每行给出一条街道的信息。第i+1行包含整数Ui、Vi、Ti(1?Ui, Vi ? N,1 ? Ti ? 1000000000),表示街道i连接居住点Ui和Vi,并且经过街道i需花费Ti分钟。街道信息不会重复给出。
Output

仅包含整数T,即最坏情况下Chris的父母需要花费T分钟才能找到Chris。
Sample Input

4 3

1 2 1

2 3 1

3 4 1

Sample Output

4

 

 

树dp

其实不是很难,只是要小心细节

我们要找出一个三叉路(允许一条为0)从大到小为a,b,c,使得a+b+b+c最大

所以我们先树dp求出每个点往下走的最长的三条边,但是这条边还可能来自于父亲,所以再dfs一遍,然后更新答案

 1 const
 2     maxn=200200;
 3 var
 4     first,u:array[0..maxn]of longint;
 5     next,last,w:array[0..maxn*2]of longint;
 6     f:array[0..maxn,0..3]of int64;
 7     n,m,tot:longint;
 8     ans:int64;
 9 
10 procedure insert(x,y,z:longint);
11 begin
12     inc(tot);
13     last[tot]:=y;
14     next[tot]:=first[x];
15     first[x]:=tot;
16     w[tot]:=z;
17 end;
18 
19 procedure up(var x:int64;y:int64);
20 begin
21     if x<y then x:=y;
22 end;
23 
24 procedure new(x:longint;y:int64);
25 begin
26     if y>f[x,0] then
27       begin
28         f[x,2]:=f[x,1];
29         f[x,1]:=f[x,0];
30         f[x,0]:=y;
31       end
32     else
33       if y>f[x,1] then
34         begin
35           f[x,2]:=f[x,1];
36           f[x,1]:=y;
37         end
38       else up(f[x,2],y);
39 end;
40 
41 procedure dfs(x,fa:longint);
42 var
43     i:longint;
44 begin
45     i:=first[x];
46     while i<>0 do
47       begin
48         if last[i]<>fa then
49         begin
50           dfs(last[i],x);
51           u[last[i]]:=w[i];
52           new(x,f[last[i],0]+w[i]);
53         end;
54         i:=next[i];
55       end;
56 end;
57 
58 function get(x,y,z:int64):int64;
59 begin
60     exit(x+y*2+z);
61 end;
62 
63 procedure dfs2(x,fa:longint);
64 var
65     i:longint;
66 begin
67     if f[x,0]+u[x]=f[fa,0] then new(x,f[fa,1]+u[x])
68     else new(x,f[fa,0]+u[x]);
69     up(ans,get(f[x,0],f[x,1],f[x,2]));
70     i:=first[x];
71     while i<>0 do
72       begin
73         if last[i]<>fa then dfs2(last[i],x);
74         i:=next[i];
75       end;
76 end;
77 
78 procedure main;
79 var
80     i,x,y,z:longint;
81 begin
82     read(n,m);
83     for i:=1 to m do
84       begin
85         read(x,y,z);
86         insert(x,y,z);
87         insert(y,x,z);
88       end;
89     dfs(1,0);
90     dfs2(1,0);
91     write(ans);
92 end;
93 
94 begin
95     main;
96 end.
View Code