华为机考-树上逃离

简介: 华为机考-树上逃离

题目


给定一棵树,这个树有n个节点,节点编号从0开始依次递增,0固定为根节点。在这棵树上有一个小猴子,初始时该猴子位于根节点(0号) 上,小猴子一次可以沿着树上的边从一个节点挪到另一个节点,但这棵树上有一些节点设置有障碍物,如果某个节点上设置了障碍物,小猴子就不能通过连接该节点的边挪动到该节点上。问小猴子是否能跑到树的叶子节点(叶子节点定义为只有一条边连接的节点),如果可以,请输出小猴子跑到叶子节点的最短路径(通过的边最少),否则输出字符串NULL。


输入


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

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

接下来的edge行是边: x y,表示x和y节点有一条边连接

边信息结束后接下来的一行给出数字block,表示接下来有block行,每行是个障碍物

接下来的block行是障碍物: X,表示节点x上存在障碍物

输出

如果小猴子能跑到树的叶子节点,请输出小猴子跑到叶子节点的最短路径(通过的边最少),比如小猴子从0经过1到达2 (叶子节点) ,那么输出“0->1->2”,否则输出“NULL”。注意如果存在多条最短路径,请按照节点序号排序输出,比如0->1和0->3两条路径,第一个节点0一样,则比较第二个节点1和3,1比3小,因此输出0->1这条路径。


样例


1. 2
2. 1
3. 0 1
4. 1
5. 1
6. 
7. 4
8. 3
9. 0 1
10. 0 2
11. 0 3
12. 1
13. 2
14. 
15. 7
16. 6
17. 0 1
18. 0 3
19. 1 2
20. 3 4
21. 1 5
22. 5 6
23. 1
24. 5
25. 
26. 4
27. 3
28. 0 1
29. 0 2
30. 0 3
31. 2
32. 2
33. 3

思路


使用广度优先搜索寻找最短路径

1. from collections import deque
2. 
3. n=int(input())
4. map = {}
5. edge = int(input())
6. for _ in range(edge):
7.     l, r = input().split(' ')
8.     l,r = int(l),int(r)
9. if l not in map: map[l]=[]
10. if r not in map: map[r]=[]
11. map[l].append(r)
12. map[r].append(l)
13. 
14. block = int(input())
15. blocks = set()
16. for i in range(block):
17.     blocks.add(int(input()))
18. 
19. def solve():
20.     queue=deque()
21.     queue.append([0,[0]])
22.     vis = set()
23.     vis.add(0)
24. while len(queue):
25.         node,path = queue.popleft()
26. if node!=0 and len(map[node])==1:
27. print(str(path)[1:-1].replace(",","->").replace(" ",""))
28. return
29. for item in map[node]:
30. if item not in blocks and item not in vis:
31.                 queue.append([item,path+[item]])
32.                 vis.add(item)
33. print("NULL")
34. 
35. solve()
目录
相关文章
|
3月前
|
算法 关系型数据库 MySQL
一网打尽二叉树系列
文章全面介绍了二叉树的定义、分类和搜索(遍历)方式,包括满二叉树、完全二叉树、二叉搜索树、平衡二叉搜索树的概念,以及前序、中序、后序和非递归遍历方法,旨在帮助读者深入理解二叉树的基本概念和应用场景。
一网打尽二叉树系列
|
5月前
|
算法 定位技术
探寻最短路径之谜:Dijkstra算法详解
探寻最短路径之谜:Dijkstra算法详解
|
6月前
|
存储 算法 程序员
2023,我与C/C++相遇的奇迹之年
2023,我与C/C++相遇的奇迹之年
|
6月前
|
算法
再探二分法
【2月更文挑战第5天】
55 3
|
6月前
|
算法 前端开发
419. 甲板上的战舰
419. 甲板上的战舰
58 0
|
机器学习/深度学习 人工智能 算法
算法在左,迷信向右 | 彭文华
算法在左,迷信向右 | 彭文华
|
算法
【过河卒】回溯算法保姆式解题
【过河卒】回溯算法保姆式解题
94 0
|
运维 监控 Java
左耳朵耗子:我做系统架构的一些原则
左耳朵耗子:我做系统架构的一些原则
178 0
2021年圣诞节送自己一颗树吧
2021年圣诞节送自己一颗树吧
2021年圣诞节送自己一颗树吧
|
存储 算法
【趣学算法】贪心算法、海盗古董装船问题
贪心选择是指原问题的整体最优解可以通过一系列局部最优的选择得到,也就是先做出当前最优的选择,将原问题变为一个相似却规模更小的子问题,而后的每一步都是当前最优的选择。这种选择依赖于已做出的选择,但不依赖于未作出的选择。