求树两个节点两个节点的最近公共父节点

int find(int x)
{
    if (p[x] != x) p[x] = find(p[x]);
    return p[x];
}

void tarjan(int u)
{
    st[u] = 1;
    for (int i = h[u]; ~i; i = ne[i])
    {
        int j = e[i];
        if (!st[j])
        {
            tarjan(j);
            p[j] = u;
        }
    }

    for (auto item : query[u])
    {
        int y = item.first, id = item.second;
        if (st[y] == 2)
        {
            int anc = find(y);  //这里求出来的anc就是最近的公共父节点
         
        }
    }

    st[u] = 2;
}

原理证明上还有些问题,日后解决下

你可能感兴趣的:(算法学习)