【tyvj1033】悠闲的漫步

72 篇文章 0 订阅

描述

Bessie透过牛棚的大门向外望去。发现今天是一个美丽的春季早晨。她想,“我真的好想好想沐浴著春风,走在草地之中,感受嫩草温柔地抚摸四蹄地的感觉。”她知道一旦她离开了牛棚,她将沿著一条小径走一段路,然后就会出现一个三岔路口,她必须在两条小径中选择一条继续走下去。然后她又会遇到更多的三岔路口,进行更多的选择,知道她到达一个青翠的牧场為止。

她决定坐一个选择使得她在去吃早草的路途中可以走过最多的小径。给你这些小径的描述,要求Bessie最多可以走过多少条小径。假定Bessie一出牛棚就有2条路径,Bessie需要从中选择一条。

农场中有P-1 (1 <= P <= 1,000) 个分岔节点(范围是1..P),引向P片草地,它们之间由小径连接。对任意一个节点来说,只有一条从牛棚(被标记為节点1)开始的路径可以到达。

考虑下面的图。线段表示小径,"%"表示草地。右边的图中的"#"表示一条到达草地的高亮的路径。

                 %                             %
                /                             /
      2----%   7----8----%          2----%   7####8----%
     / \      /      \             # #      #      #
    1   5----6        9----%      1   5####6        9----%
     \   \    \        \           \   \    \        #
      \   %    %        %           \   %    %        %
       \                             \
        3-----%                       3-----%
         \                             \
          4----%                        4----%
           \                             \
            %                             %

从分岔节点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也一样。

输入格式

* 第1行: 一个单独的整数: P

* 第2到第P行: 第i+1行有3个由空格隔开的整数,表示一个分岔节点Cn, D1和D2。

输出格式

* 第一行: 一个单独的整数,表示Bessie去最远的草地的路上最多可以走过的小径的数目。

测试样例1

输入

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

备注

1-2-5-6-7-8-9-P是最长的一条路径之一。
【题解】

深搜找最大深度即可

【代码】

#include<iostream>
#include<cstring>
#include<cstdio>
using namespace std;
int p,s,t1,t2;
bool b[1005];
int h[1005];
int a[1005][2];
inline void dfs(int dep,int x){
	h[x]=max(h[x],dep);
	if (x==0) return;
	for (int i=1;i<=2;++i){
		int v=a[x][i];
		if (!b[v]||!v){
			b[v]=true;
			dfs(dep+1,v);
		}
	}
}
int main(){
	scanf("%d",&p);
	for (int i=1;i<=p;++i) b[i]=true;
	for (int i=1;i<=p-1;++i){
		scanf("%d%d%d",&s,&t1,&t2);
		a[s][1]=t1; a[s][2]=t2;
		b[s]=false;
	}
	b[1]=true;
	dfs(1,1);
	printf("%d",h[0]-1);
}



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

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值