点集直径

这篇博客介绍了如何解决在一棵包含n个节点的树上,针对Q次询问,每个询问给定点集S,找到使f(u)=maxv∈Sdist(u,v)最小的u的问题。其中dist(u,v)表示树上节点u到v的边数。博主通过分析指出答案等于S的直径的一半,向上取整,并提供了一种计算直径的伪代码方法,涉及动态维护直径的过程。" 76807618,3332691,理解流媒体协议:RTSP、SDP与MMS详解,"['流媒体', 'RTSP协议', 'SDP协议', 'MMS协议']
摘要由CSDN通过智能技术生成

MMSet2
给定一棵n个节点的树,点编号为1…n。
Q次询问,每次询问给定一个点集S,令, f ( u ) = max ⁡ v ∈ S d i s t ( u , v ) f(u)=\max_{v\in S}dist(u,v) f(u)=maxvSdist(u,v)
你需要求出 min ⁡ u = 1 … n f ( u ) \min_{u=1\dots n}f(u) minu=1nf(u)
其中dist(u,v)表示树上路径(u,v)的边数。
输入描述:
第一行一个整数n,接下来n−1行每行两个整数表示树上的一条边。
接下来一行一个整数Q,接着Q行,每行第一个数是|S|,剩下|S|个互不相同的数代表这个集合。
输出描述:
输出Q行,每行一个整数表示答案。
示例1
输入

3
1 2
1 3
1
2 2 3

输出

1

备注:
n≤3×105,|S|≥1,∑|S|≤106
每条边的长度是1,显然答案ans就是S的若干条直径中两条半径差值最小时较大的那条半径,因为如果有u’点到S的其他点的距离均小于刚刚的答案,那么直径就可以减小了,当然,这样的半径也能成为f(u),因为如果f(u)能扩大,则直径就能增大了。
由于边权均为1,假设两半径为 r i , r 2 r_i,r_2 ri,r2 r 1 > r 2 r_1>r_2

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值