GESP编程共123题,本题是整站第1438题,已经有人完成了本题,加油!
小杨有一棵包含 n 个节点的树,树上的一些节点放置有宝物。
小杨可以任意选择一个节点作为起点并在树上移动,但是小杨只能经过每条边至多一次,当小杨经过一条边后,这条边就会消失。小杨每经过一个放置有宝物的节点就会取得该宝物。
小杨想请你帮他判断自己能否成功取得所有宝物。
本题单个测试点内有多组测试数据。输入第一行包含一个正整数 t,代表测试用例组数。
接下来是 t 组测试用例。对于每组测试用例,一共 n+1 行。
第一行包含一个正整数 n,代表树的节点数。
第二行包含 n 个非负整数 a1,a2,…an,其中如果 ai=1,则节点 i 放置有宝物;若 ai=0,则节点 i 没有宝物。
之后 n−1 行,每行包含两个正整数 xi,yi,代表存在一条连接节点 xi 和 yi 的边。
对于每组测试数据,如果小杨能成功取得所有宝物,输出 Yes,否则输出 No。
输入 #1
2 5 0 1 0 1 0 1 2 1 3 3 4 3 5 5 1 1 1 1 1 1 2 1 3 3 4 3 5
输出 #1
Yes No
对于第一组测试用例,小杨从节点 2 出发,按照 2−1−3−4 的顺序即可成功取得所有宝物。
子任务编号 | 数据点占比 | t | n |
---|---|---|---|
1 | 20% | ≤10 | ≤5 |
2 | 20% | ≤10 | ≤10^3 |
3 | 60% | ≤10 | ≤10^5 |
对全部的测试点,保证 1≤t≤10,1≤n≤10^5,0≤ai≤1,且保证树上至少有一个点放置有宝物。
【题目大意】在一棵有n个结点的树中,有一些点上有宝物,有一些点没有,可以在结点直接移动,但是走过的路不能再走,问能否把所有有宝物的点都走一遍。
【考纲知识点】建树知识,深搜知识
【解题思路】通过题意初步可以想到以每一个点作为起点进行搜索,再搜索过程中记录搜到的ai=1的点,搜索结束后比较和1的总数是否相同。由于数据范围较大,因此明显会超时。
由于每个节点只能走一次,所以可以从最深的宝物开始收集可以确保小杨在返回时不会重复经过已经消失的边(因为边会在经过一次后消失)。然后从这个节点回到根节点,如果是1那么就标记走了一次,如果这里被标记两次那么肯定是不满足题目要求。
【参考程序】
本站题目仅供学习,GESP版权归CCF所有,如有侵权请联系删除。站长陈老师QQ及微信:208234。