【华为419机考真题】树上逃离 or 猴子爬树

给定一棵树和障碍物信息,需要找出猴子从根节点到叶子节点的最短无阻碍路径,或者在无法到达叶子节点时输出NULL。问题涉及图论和最短路径算法。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

本篇题解:树上逃离 or 猴子爬树

题目描述

给定一棵树,这个树有 nnn 个节点,节点编号从 000 开始依次递增,000 固定为根节点。
在这棵树上有一个小猴子,初始时该猴子位于根节点(000号) 上,小猴子一次可以沿着树上的边从一个节点挪到另一个节点,但这棵树上有一些节点设置有障碍物,如果某个节点上设置了障碍物,小猴子就不能通过连接该节点的边挪动到该节点上。

问小猴子是否能跑到树的叶子节点(叶子节点定义为只有一条边连接的节点),如果可以,请输出小猴子跑到叶子节点的最短路径(通过的边最少),否则输出字符串 NULL。

输入

第一行给出数字 nnn,表示这个树有 nnn 个节点,节点编号从 000开始依次递增,000 固定为根节点,1<=n<100001<=n<100001<=n<10000

第二行给出数字 edgeedgeedge,表示接下来有 edgeedgeedge 行,每行是一条边

接下来的 edgeedgeedge行是边:xyx yxy,表示 xxxyyy 节点有一条边连接

接下来的一行给出数字 blockblockblock,表示接下来有 blockblockblock行,每行是个障碍物

接下来的 blockblockblock 行是障碍物:xxx,表示节点 xxx 上存在障碍物。

输出

如果小猴子能跑到树的叶子节点,请输出小猴子跑到叶子节点的最短路径(通过的边最少)

比如小猴子从 0 经过 1 到达 2 (叶子节点) ,那么输出 0->1->2,否则输出 NULL

注意如果存在多条最短路径,请按照节点序号排序输出,比如 0->10->3 两条路径,第一个节点 0 一样,则比较第二个节点 1313 小,因此输出 0->1 这条路径。
再如 0->5->2->30->5->1->4,则输出 0->5-31->4

示例一

输入

4
3
0 1
0 2
0 3
2
2
3

输出

0->1

说明

n=4,edge=[[0,1],[0,2],[0,3]],block=[2,3] 表示一个有 4 个节点、3 条边的树,其中节点 2 和节点 3 上有障碍物,小猴子能从 0 到达叶子节点 1 (节点 1 只有一条边[1,0]和它连接,因此是叶子节点) ,即可以跑出这个树,所以输出为 0->1

示例二

输入

7
6
0 1
0 3
1 2
3 4
1 5
5 6
1

输出

0->1->2

说明

节点 4 上有障碍物,因此 0-3-4 这条路不通,节点 2 和节点 6 都是叶子节点,但 0->1->20->1->5->6 路径短(通过的边最少) ,因此输出为 0->1->2

示例三

输入

2
1
0 1
1
1

输出

NULL

说明

节点 1 是叶子节点,但存在障碍物,因此小猴子无法到达叶子节点,输出 NULL

示例四

输入

4
3
0 1
0 2
0 3
1
2

输出

0->1

说明

n=4,edge=[[0,1],[0,2],[0,3]],block=[2] 表示一个有 4 个节点、3 条边的树,其中节点 2 上有障碍物,小猴子能从 0 到达叶子节点 1 (节点 1 只有一条边[0,1]和它连接,因此是叶子节点) ,路径是 0->1,也能从 0 到达叶子节点 3(节点 3 只有一条边 [0,3] 和它连接,因此是叶子节点) ,路径是 0->3,因此按通过节点的顺序及序号比较选择 0->1

评论 2
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

梦想橡皮擦

如有帮助,来瓶可乐

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

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

余额充值