题目描述
Bessie looks out the barn door at the beautiful spring day and thinks to herself, ‘I‘d really like to enjoy my walk out to the pastures for the tender spring grass.‘ She knows that once she leaves the barn, she will traverse a path for a while, take one of two choices that lead to other paths, follow one of them, take one of two other choices, and continue on until the path leads to a verdant pasture.
She decides to make the set of path choices that enables her to walk over the greatest number of cow paths on her way to breakfast. Given the description of these paths, determine how many cow paths she traverses, presuming that she commences choosing various paths as soon as she leaves the barn.
The farm has P (1 <= P <= 1,000) pastures that are lead to by P-1 choice-nodes (range 1..P-1) connected by paths. From the barn (which is node 1), only one set of path traversals exists to reach any choice-node or pasture.
Consider this set of paths (lines), pastures (‘%‘), and the highlighted (‘#‘) route to a pasture on the right:
% %
/ /
2----% 7----8----% 2----% 7####8----%
/ \ / \ # # # #
1 5----6 9----% 1 5####6 9----%
\ \ \ \ \ \ \ #
\ % % % \ % % %
\ 3-----% 3-----%
\ 4----% 4----%
\ % %
The pasture reached from choice-node 9 is one of two that enable Bessie to traverse seven different cowpaths on the way to breakfast. These are the ‘furthest‘ pastures from node 1, the barn.
Three integers describe each node: Cn, D1, and D2. Cn is the
nodenumber (1 <= Cn <= P-1); D1 and D2 are the destinations from that node (0 <= D1 <= P-1; 0 <= D2 <= P-1). If D1 is 0, the node leads to a pasture in that direction; D2 has the same property.
POINTS: 100
Bessie透过牛棚的大门向外望去。发现今天是一个美丽的春季早晨。她想,“我真的好想好想沐浴着春风,走在草地之中,感受嫩草温柔地抚摸四蹄地的感觉。”她知道一旦她离开了牛棚,她将沿着一条小径走一段路,然后就会出现一个三岔路口,她必须在两条小径中选择一条继续走下去。然后她又会遇到更多的三岔路口,进行更多的选择,知道她到达一个青翠的牧场为止。
她决定作一个选择使得她在去吃早草的路途中可以走过最多的小径。给你这些小径的描述,求出Bessie最多可以走过多少条小径。假定Bessie一出牛棚就有2条路径,Bessie需要从中选择一条。
农场中有P-1 (1 <= P <= 1,000) 个分岔节点(范围是1..P),引向P片草地,它们之间由小径连接。对任意一个节点来说,只有一条从牛棚(被标记为节点1)开始的路径可以到达。
考虑下面的图。线段表示小径,"%"表示草地。右边的图中的"#"表示一条到达草地的高亮的路径。
从分岔节点9到达的草地是两个可以让Bessie走过最多小径的草地之一。在去吃早草的路上Bessie将走过7条不同的小径。这些草地是离牛棚也就是节点1最“远”的。
由3个整数来表示每一个节点:Cn, D1和D2,Cn是节点的编号(1 <= Cn <= P-1); D1和D2是由该节点引出的两条小径的终点(0 <= D1 <= P-1; 0 <= D2 <= P-1)。如果D1为0,表示这条小径引向的是一片牧草地;D2也一样。
输入输出格式
输入格式:
* Line 1: A single integer: P
* Lines 2..P: Line i+1 contains three space-separated integeres that describe a choice-node: Cn, D1, and D2
输出格式:
* Line 1: A single integer that is the largest number of paths Bessie can traverse on the way to the furthest pasture.
输入输出样例
说明
This input describes the example farm layout in the task description.
1-2-5-6-7-8-9-P is one of the longest routes.
思路:把树标记一下深度,深度最深的就是答案。
#include<cstdio> #include<cstring> #include<iostream> #include<algorithm> #define MAXN 5001 using namespace std; int n,m,num,tot,ans; int vis[MAXN],deep[MAXN],dad[MAXN]; int to[MAXN*2],net[MAXN*2],head[MAXN*2]; void add(int u,int v){ to[++tot]=v;net[tot]=head[u];head[u]=tot; to[++tot]=u;net[tot]=head[v];head[v]=tot; } void dfs(int now){ deep[now]=deep[dad[now]]+1; for(int i=head[now];i;i=net[i]) if(dad[now]!=to[i]){ dad[to[i]]=now; dfs(to[i]); } } int main(){ scanf("%d",&n);num=n; for(int i=1;i<n;i++){ int x,y,z; scanf("%d%d%d",&x,&y,&z); if(y==0) add(x,++num),vis[num]=1; else add(x,y); if(z==0) add(x,++num),vis[num]=1; else add(x,z); } dfs(1); for(int i=n+1;i<=num;i++) ans=max(ans,deep[i]); cout<<ans-1; }