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

    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 -

    算法题 | 你追我,如果你追到我……那就算你赢了-LMLPHP

    10-09 17:31