算法题 | 你追我,如果你追到我……那就算你赢了 (2)

db大于2da

所以我们要求的就只有两点,第一点是一开始它们之间的距离,以及树的直径(树上最长的链路长度)。好在这两点都可以通过递归实现。都理出来了之后代码就不难写了:

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 -

内容版权声明:除非注明,否则皆为本站原创文章。

转载注明出处:https://www.heiqu.com/wsxxfd.html