10
7 8 0
5 0 6
9 0 0
6 0 7
3 4 0
2 5 0
8 0 9
4 0 0
1 2 3
7
搜索就可以过,仔细思考一下这个题可以发现就是一棵树从根节点到他的任意一个子节点的最长路径。我写了一个在水不过的DFS,应该可以有其他方法的。
PS:作为一个强迫症患者,我无法容忍存节点的数组是无序的,所以在时间允许的情况下,我把它们按序号排了一个序,虽然没有什么卵用吧,然而看着顺眼。
type tree=record r,l,f,num:longint; end; var a:array[-1..1000] of tree; i,j,n,x,y,z,sum,ans:longint; function max(x,y:longint):longint; begin if x<y then exit(y) else exit(x); end; procedure dfs(x:longint); var i,j,k:longint; begin if (a[x].l=0)and(a[x].r=0) then begin inc(sum); ans:=max(ans,sum); exit; end; if (a[x].l=0) then begin inc(sum); ans:=max(ans,sum); dec(sum); end; if (a[x].r=0) then begin inc(sum); ans:=max(ans,sum); dec(sum); end; inc(sum); dfs(a[x].r); dec(sum); dfs(a[x].l); dec(sum); end; procedure sort(l,r: longint); var i,j,x:longint;y:tree; begin i:=l; j:=r; x:=a[(l+r) div 2].num; repeat while a[i].num<x do inc(i); while x<a[j].num do dec(j); if not(i>j) then begin y:=a[i]; a[i]:=a[j]; a[j]:=y; inc(i); j:=j-1; end; until i>j; if l<j then sort(l,j); if i<r then sort(i,r); end; procedure init; var i,j:longint; begin readln(n); for i:=1 to n-1 do begin readln(x,y,z); a[i].num:=x; a[i].l:=y; a[i].r:=z; end; end; begin ans:=-1;sum:=0; init; sort(1,n-1); dfs(1); writeln(ans); end.
原文:http://www.cnblogs.com/yangqingli/p/4852621.html