树的练习题之#D. Journey之二

题目

Description

给出一棵树N个点及数字K

接下来N-1行描述有关边的开始点,结束点.

保证图中不会有环

接下来K个数字,代表你要走过的点的编号.当然你可以自己选择出发点及行进的路线

不一定按给定编号顺序前行,求走过的最短距离。

Format

Input

第一行给出N,K。

2 <= N<= 50000,1<=K<=N

接下来N-1行,描述这个树

最后一行给出K个数字,代表点的编号。1<=编号<=N

Output

如题

Samples

输入数据 1

输出数据 1

输入数据 2

输出数据 2

Hint

注意当K=1的情况

题解

其实这一题跟Journey这道题很像,只是改变了k的值没有了边权而已。

我们首先的思路是暴力枚举K个数字,可是这样的话只有48分!!!!!!!😭😭😭

那要怎么编呢?我们先来分析一下样例的路线

红色的线是路径。

我们先观察一下:这一组样例的起始点是深度最深且是必须要走过的点

发现了什么?我们现在有一个大胆的猜测:我们是不是要从深度最深且是必须要走过的那个点开始遍历呢???

YES!因为这样做大大减少了往返的距离,使得便利到该节点时又返回到根结点(因为该结点深度最深,不能再往下便利了,如果还有结点,那也不是必须要走过的那个点)的距离为0(因为该结点就是根节点)。

于是我打了一个代码:

结果...........

WHAT? ? ? ?

我发现有Runtime Error,于是我把数组开大到10^6后就

AC了!!!!!!

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

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值