所以我们要求的就只有两点,第一点是一开始它们之间的距离,以及树的直径(树上最长的链路长度)。好在这两点都可以通过递归实现。都理出来了之后代码就不难写了:
t = int(input())
depth = [0 for _ in range(200050)]
for _ in range(t):
n, a, b, da, db = list(map(int, input().split(' ')))
edges = [[] for _ in range(n+2)]
for i in range(n-1):
u, v = list(map(int, input().split(' ')))
edges[u].append(v)
edges[v].append(u)
diameter = 0
depth[a] = 0
def dfs(u, f):
global diameter
l = 0
for v in edges[u]:
if v == f:
continue
# depth数组记录每个节点的树深
depth[v] = depth[u] + 1
cur = 1 + dfs(v, u)
# cur + l即u节点到叶子节点的最长距离和次长距离
# 直径就是这两者和之中最大的一个
diameter = max(diameter, cur + l)
l = max(l, cur)
return l
# 以Alice所在的点作为树根,这样depth[b]即Alice和Bob的距离
dfs(a, -1)
if depth[b] <= da or da * 2 >= diameter or da*2 >= db:
print('Alice')
else:
print('Bob')
我们把整个思路说穿了是不是有一种一文不值的感觉?但是自己思考要想明白还是不太容易的,codeforces的问题就是这样,经常需要我们在纸上画一画看一看。有时候一些点靠自己想很难完全想明白,但是找一个例子试一试一下就清楚了。这也是codeforces问题有趣的地方之一。
衷心祝愿大家每天都有所收获。如果还喜欢今天的内容的话,请来一个三连支持吧~(点赞、关注、转发)
本文使用 mdnice 排版
- END -