substack全部RE (python)到底是为什么呀!
查看原帖
substack全部RE (python)到底是为什么呀!
495452
love1matters楼主2023/5/3 16:13
#快速输入
import sys
from math import log
input = lambda: sys.stdin.readline().strip()
n,m,s=map(int,input().split())
#邻接表存树
tree=[[] for _ in range(n+1)]
f=[[-1]*21 for _ in range(n+1)]#2^20足够大了
depth=[0]*(n+1)
depth[s]=0

def dfs(v,p):#预处理f,depth
    f[v][0]=p
    d=depth[v]+1
    for i in range(1,d):
        if (1<<i)>=d:
            break
        f[v][i]=f[f[v][i-1]][i-1]#2**i-1+2**i-1=2**i
    for u in tree[v]:
        if u!=p:
            depth[u]=d
            dfs(u,v)
def lca(u,v):
    if depth[u]<depth[v]:
        u,v=v,u
    t=depth[u]-depth[v]
    for i in range(20,-1,-1):
        if t&(1<<i):
            u=f[u][i]
    #此时深度较大u跳至与v平齐,先判断,再一起往上跳
    if u==v:
        return u
    for i in range(int(log(depth[u],2)),-1,-1):
        if f[u][i]!=f[v][i]:
            #往上跳
            u,v=f[u][i],f[v][i]
    return f[u][0]
#main
for i in range(n-1):
    x,y=map(int,input().split())
    tree[x].append(y)
    tree[y].append(x)
dfs(s,-1)
for i in range(m):
    u,v=map(int,input().split())
    print(lca(u,v)+1)
2023/5/3 16:13
加载中...