tarjan
/*
dfs1 dep[N] siz[N] son[N] fa[N]
dfs2 top[N]
*/
node* tarjan(node* a, node* b) {
if (top[a] == NULL || top[b] == NULL)return NULL;
while (top[a] != top[b]) {//a和b分别在两个不同的重链
if (top[a]->dep < top[b]->dep)swap(a, b);//一次只跳深度大的一个
a = fa[top[a]]; //跳到上一个重链
}
if (a->dep > b->dep)swap(a, b);//比较的是a和b的深度 返回深度小的
return a;
}
浙公网安备 33010602011771号